Python异步编程
异步编程
在Python中,由于CPython
的GIL
限制,不能使用多线程充分利用资源,因此在进行诸如文件存取、网络请求等IO操作的时候极其浪费资源,程序往往要在一个点上空等。虽然Python可以借助多进程来改善,但是进程相比线程来说过重,如果只用多进程就可以完全解决问题,线程这个概念也就不会出现了。
在耗时任务(主要是IO)的操作上,Python提供了一些方法来解决,比如协程的概念。初次了解协程的时候认为这是可以拯救世界的东西,概念新颖,方法独特,但是在了解了如C#的async/await
以及Javascript(同样是单线程语言)的async/await
之后,明白了基于yield/send
的协程仍然使用起来仍然不够顺手。
在Python3.4
版本之后,Python引入了asyncio
标准库,使用@coroutine
和EventLoop
可以更方便地完成Python协程的工作,接着在Python3.5
中,Python引入了async/await
关键字,彻底简化了Python异步编程流程。自从C#最早提出async/await
之后,很多语言都引入了这一机制,因为它真的太好用了,可以完全以同步的风格进行异步编程。不过由于与C#的实现机制不同,在Python协程中仍然有一些具体的细节无法回避,比如send/yield
的交互。
工具对比
在Python生态系统中,有很多异步编程库可以使用,这些编程库有的是诞生于Python异步支持之前,自行实现了事件循环,有的是依托于Python的异步机制进一步开发,在进行异步编程的时候,可以借助以下的工具来简化工作: