python实现协程的三种方式

    xiaoxiao2023-09-20  31

    1.使用yield 来实现协程

    import asyncio import time async def job(t): # async 形式的功能 print('Start job ', t) await asyncio.sleep(t) # 等待 "t" 秒, 期间切换其他任务 print('Job ', t, ' takes ', t, ' s') async def main(loop): # async 形式的功能 tasks = [ loop.create_task(job(t)) for t in range(1, 3) ] # 创建任务, 但是不执行 await asyncio.wait(tasks) # 执行并等待所有任务完成 t1 = time.time() loop = asyncio.get_event_loop() # 建立 loop loop.run_until_complete(main(loop)) # 执行 loop,并且等待所有任务结束 loop.close() # 关闭 loop print("Async total time : ", time.time() - t1)

    执行结果:

    Start job  1 Start job  2 Job  1  takes  1  s Job  2  takes  2  s Async total time :  2.01411509513855  

    2. 使用greenlet 模块,通过switch来切换不同的代码块协程运行

    from greenlet import greenlet def foo(): print("foo") bar() def bar(): a = 3 + 1 print(a) gr2.switch() print("end bar") gr1 = greenlet(bar) gr2 = greenlet(foo) gr1.switch()

    执行结果:

    4 foo 4 end bar

    3.使用gevent 模块实现协程

    import requests import gevent def f(url):     print('GET: %s' % url)     data = requests.get(url).text     print('%d bytes received from %s.' % (len(data), url)) gevent.joinall([     gevent.spawn(f, 'https://www.python.org/'),     gevent.spawn(f, 'https://www.yahoo.com/'),     gevent.spawn(f, 'https://github.com/'), ]) print("End of File")

    执行结果:

    最新回复(0)