Python中的异步编程
在Python中,有没有一种通用的异步编程概念?我能否给一个函数指定一个回调函数,然后立即执行这个回调,接着返回到主程序的流程中,而不管这个函数的执行需要多长时间?
6 个回答
大家好,带来好消息!
Python 3.4将会加入全新的、雄心勃勃的异步编程实现!
根据PEP 3153:异步IO支持和PEP 3156:异步IO支持重启的描述:
现在想在Python中编写异步代码的人有几个选择:
可惜的是,这些选择都有一些缺点,而这个PEP试图解决这些问题。
尽管asyncore模块已经在Python标准库中存在很长时间,但它存在一些根本性的问题,因为它的API不够灵活,无法满足现代异步网络模块的需求。
而且,它的设计过于简单,无法为开发者提供充分利用异步网络潜力所需的所有工具。
目前在生产环境中最流行的解决方案是使用第三方库。这些库通常能提供不错的解决方案,但它们之间缺乏兼容性,导致代码往往与所用的库紧密耦合。
这种不同异步IO库之间缺乏可移植性,给第三方库的开发者带来了很多重复的工作。如果有一个足够强大的抽象层,异步代码可以一次编写,但可以在任何地方使用。
这里是它的简要概述。
你所描述的情况(主程序在另一个函数执行时立即恢复运行)其实并不算是我们通常说的“异步”编程(也叫“事件驱动”编程),而是“多任务”编程(也叫“多线程”或“多进程”)。你可以通过标准库中的 threading
和 multiprocessing
模块实现你所说的效果(后者可以在多核机器上实现真正的并行执行)。
异步(事件驱动)编程在标准的Python库中是通过 asyncore
和 asynchat
模块来支持的,这些模块主要用于网络任务(实际上它们内部使用了 select
模块,而在Windows上,这个模块只支持套接字——不过在类Unix系统上,它也可以支持任何文件描述符)。
如果你想要更通用的异步(事件驱动)编程支持(虽然大部分还是与网络相关,但并不局限于此),可以看看 twisted 这个第三方包。
看看这里:
值得一看:
asyncio(之前叫Tulip)已经被加入到Python的默认分支中
编辑于2018年3月14日
现在Python内置了asyncIO——异步输入输出、事件循环、协程和任务。
以下是从上面链接中摘录的描述:
asyncIO模块提供了一个基础设施,用于编写单线程的并发代码,使用协程、在套接字和其他资源上进行多路复用输入输出、运行网络客户端和服务器,以及其他相关的基本功能。以下是这个包的更详细内容:
- 一个可插拔的事件循环,具有各种系统特定的实现;
- 传输和协议的抽象(类似于Twisted中的那些);
- 对TCP、UDP、SSL、子进程管道、延迟调用等的具体支持(某些可能依赖于系统);
- 一个Future类,模仿了concurrent.futures模块中的Future,但适用于事件循环;
- 基于yield from(PEP 380)的协程和任务,帮助以顺序的方式编写并发代码;
- 对Future和协程的取消支持;
- 用于在单线程中协程之间的同步原语,模仿了threading模块中的那些;
- 一个接口,用于将工作交给线程池,当你绝对需要使用一个会阻塞输入输出调用的库时。
异步编程比传统的“顺序”编程要复杂:请查看使用asyncio开发页面,其中列出了常见的陷阱,并解释了如何避免它们。在开发过程中启用调试模式,以便发现常见问题。
同样值得一看: