asyncio
asyncio 是用来编写 并发 代码的库,使用 async/await 语法。asyncio 被用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。asyncio 往往是构建 IO 密集型和高层级 结构化 网络代码的最佳选择。
asyncio
的编程模型就是一个消息循环。我们从asyncio
模块中直接获取一个EventLoop
的引用,然后把需要执行的协程扔到EventLoop
中执行,就实现了异步IO。具体的实现过程如下所示:
import asyncio @asyncio.coroutine def hello(): print("Hello world!") # 异步调用asyncio.sleep(1): r = yield from asyncio.sleep(1) print("Hello again!") # 获取EventLoop: loop = asyncio.get_event_loop() # 执行coroutine loop.run_until_complete(hello()) loop.close()
# 不用异步 import time def hello(): time.sleep(2) def run(): for i in range(5): hello() print('Hello World:%s' % time.time()) if __name__ == '__main__': run() 结果:大概10s Hello World:1587717845.6814182 Hello World:1587717847.6816528 Hello World:1587717849.6827018 Hello World:1587717851.683061 Hello World:1587717853.6839545 # 用异步 import time import asyncio # 定义异步函数 async def hello(): asyncio.sleep(2) print('Hello World:%s' % time.time()) def run(): for i in range(5): loop.run_until_complete(hello()) loop = asyncio.get_event_loop() if __name__ =='__main__': run() 结果:大概0s Hello World:1587717914.2957444 Hello World:1587717914.2957444 Hello World:1587717914.2957444 Hello World:1587717914.2957444 Hello World:1587717914.2957444 #异步方式实现,第一种同步方式 import time import asyncio @asyncio.coroutine def hello(): r = yield from asyncio.sleep(2) print('Hello World:%s' % time.time()) def run(): loop = asyncio.get_event_loop() for i in range(5): loop.run_until_complete(hello()) if __name__ =='__main__': run()
@asyncio.coroutine
把一个generator标记为coroutine类型,然后,我们就把这个coroutine
扔到EventLoop
中执行。
hello()
会首先打印出Hello world!
,然后,yield from
语法可以让我们方便地调用另一个generator
。由于asyncio.sleep()
也是一个coroutine
,所以线程不会等待asyncio.sleep()
,而是直接中断并执行下一个消息循环。当asyncio.sleep()
返回时,线程就可以从yield from
拿到返回值(此处是None
),然后接着执行下一行语句。把
asyncio.sleep(1)
看成是一个耗时1秒的IO操作,在此期间,主线程并未等待,而是去执行EventLoop
中其他可以执行的coroutine
了,因此可以实现并发执行。我们用Task封装两个
coroutine
试试:import threading import asyncio @asyncio.coroutine def hello(): print('Hello world! (%s)' % threading.currentThread()) yield from asyncio.sleep(1) print('Hello again! (%s)' % threading.currentThread()) loop = asyncio.get_event_loop() tasks = [hello(), hello()] loop.run_until_complete(asyncio.wait(tasks)) loop.close()
import threading import asyncio @asyncio.coroutine def hello(): print('Hello world! (%s)' % threading.currentThread()) asyncio.ensure_future(hello2()) print('Hello again! (%s)' % threading.currentThread()) @asyncio.coroutine def hello2(): sum = 0 for i in range(10000000): sum += 1 print(1) return sum loop = asyncio.get_event_loop() tasks = [hello(), hello()] loop.run_until_complete(asyncio.wait(tasks)) loop.close()
python asyncio 异步操作
猜你喜欢
转载自blog.csdn.net/qq_36336522/article/details/105734848
今日推荐
周排行