上次,我们看到您可以利用ThreadPool进行多处理:
您也可能会喜欢方便的async/await
语法,以异步执行任务,这正是asyncio
所做的。
异步IO?
Asyncio允许编写并发代码。
您经常会在专业用法中看到它。
但是,您可能不知道异步IO 在一个过程中使用单个线程。
这是 违反直觉,您可能会发现许多“并发代码”的用法,但是任务并非固有地并发。
这是另一种与穿线或多处理不同的方法,设计。
异步编程并不容易
不好的做法是将async
/await
用于任何事物。
对我来说,您应该更多地关注异步与同步代码,而不是“并发”。
使用async
/async with
,您将操纵Coroutines并使用await
暂停执行,直到您得到您正在等待的东西。
这几乎是“ Coroutine”的含义:可以暂停其对其他操作执行的函数。
要定义coroutine,只需使用async
:
import asyncio
async def test():
print("test")
if __name__ == '__main__':
asyncio.run(test())
要暂停执行,请使用await
:
import asyncio
async def test():
await asyncio.sleep(7)
return "test"
async def main():
t = await test()
print(t)
if __name__ == '__main__':
asyncio.run(main())
您可以将await
视为断点。
利弊
根据我的经验,异步IO的好处可能是多个:
- 非阻止电话,尤其是使用HTTP请求
- 优化的CPU用法
- 等待对象
- 能够连接Coroutines的能力
但是,有一些缺点:
- 很难调试
- 很容易滥用它(例如,使用异步以及阻塞呼叫)