python中是否存在异步编程的一般概念?我可以为一个函数分配一个回调函数,执行它并立即返回主程序流程,无论该函数的执行需要多长时间?
你描述的内容(主程序流在另一个函数执行时立即恢复)不是通常所谓的"异步"(AKA"事件驱动")编程,而是"多任务"(AKA"多线程"或"多处理").你可以得到你的标准库模块描述了threading
与multiprocessing
(后者允许在多核机器实际的并发执行).
异步(事件驱动)编程在asyncore
和asynchat
模块中的标准Python库中得到支持,它们非常面向网络任务(实际上它们在内部使用select
模块,在Windows上,它只支持套接字 - 尽管在Unixy OS上它可以也支持任何文件描述符).
对于更一般的(虽然也主要是面向网络,但不限于此)支持异步(事件驱动)编程,请查看扭曲的第三方软件包.
看看这里:
Python中的异步编程
异步编程和扭曲的介绍
值得一试:
asyncio(以前的Tulip)已经被检入Python默认分支
今天Python有asyncIO - 异步I/O,事件循环,协程和内置任务.
从以上链接中获取的描述:
该ASYNCIO模块提供了使用协同程序编写单线程并发代码通过套接字和其他资源,多路I/O访问,运行网络客户端和服务器,以及其他相关的基础设施的原语.以下是包内容的更详细列表:
一个可插入的事件循环,具有各种特定于系统的实现;
传输和协议抽象(类似于Twisted中的那些);
对于TCP,UDP,SSL,子管道,延迟呼叫,和其他具体的支持(有些可以是依赖于系统的);
一个Future类,它模仿concurrent.futures模块中的那个,但适用于事件循环;
基于(PEP 380)的产量的协程和任务,以帮助以顺序方式编写并发代码;
对期货和协同程序的取消支持;
在单个线程中的协同程序之间使用的同步原语,模仿线程模块中的那些;
传递工作开了一个线程池的接口,用于时候,你绝对,积极必须使用,使阻塞I/O调用的库.
异步编程比传统的"连续"编程更加复杂:看到与ASYNCIO页面开发列出一些常见的陷阱,并说明如何避免它们.在开发期间启用调试模式以检测常见问题.
还值得一试:
使用asyncIO在Python中进行异步编程的指南
大家好消息!
Python 3.4将包括全新的雄心勃勃的异步编程实现!
它目前被称为郁金香,已经有一个活跃的追随者.
如PEP 3153中所述:异步IO支持和PEP 3156:重新启动异步IO支持:
想要用Python编写异步代码的人现在有几个选择:
asyncore和asynchat;
定制的东西,很可能是基于选择模块;
使用第三方库,例如Twisted或gevent.
不幸的是,这些选项中的每一个都有它的缺点,这是PEP试图解决的问题.
尽管已经成为Python标准库的一部分很长一段时间,但asyncore模块仍然存在根本缺陷,因为它不能满足现代异步网络模块的要求.
此外,它的方法过于简单,无法为开发人员提供他们所需的所有工具,以充分利用异步网络的潜力.
目前在生产中使用的最流行的解决方案涉及使用第三方库.这些通常提供令人满意的解决方案,但这些库之间缺乏兼容性,这往往使代码库与它们使用的库紧密耦合.
目前,不同异步IO库之间缺乏可移植性会给第三方库开发人员带来大量重复工作.足够强大的抽象可能意味着异步代码被编写一次,但在任何地方都使用.
以下是它的能力的简要概述.
其他受访者指向Twisted,这是一个伟大而且非常全面的框架,但在我看来,它有一个非常不同于pythonic的设计.另外,AFAICT,你必须使用Twisted主循环,如果你已经在使用提供自己的循环的其他东西,这可能是一个问题.
这是一个可以证明使用threading
模块的人为例子:
from threading import Thread def background_stuff(): while True: print "I am doing some stuff" t = Thread(target=background_stuff) t.start() # Continue doing some other stuff now
但是,在几乎所有有用的情况下,您都希望在线程之间进行通信.您应该查看同步原语,并熟悉并发概念和相关问题.
该threading
模块提供了很多这样的原语供您使用,如果你知道如何使用它们.