在python中的asynchronous编程
python中有asynchronous编程的一般概念吗? 我可以给一个函数分配一个callback,执行它并立即返回到主程序stream程,无论该函数执行多长时间?
看看这里:
Python中的asynchronous编程
asynchronous编程和扭曲的介绍
值得检查:
asyncio(以前的郁金香)已经被检入Python默认分支
你所描述的(主程序stream在另一个函数执行时立即恢复)并不是通常所说的“asynchronous”(AKA“事件驱动”)编程,而是“多任务”(又称“multithreading”或“多处理”)。 您可以通过标准库模块threading
和multiprocessing
(后者允许在多核机器上实际并发执行)获得您所描述的内容。
asynchronous(事件驱动)编程在asyncore
和asynchat
模块的标准Python库中得到了支持,这些模块非常面向networking任务(实际上它们在内部使用select
模块,在Windows上只支持套接字 – 尽pipe在Unixy操作系统,它也可以支持任何文件描述符)。
对于更一般的(虽然也主要是面向networking的,但不限于此)支持asynchronous(事件驱动)编程,请检查扭曲的第三方包。
大家好消息!
Python 3.4将包含全新的雄心勃勃的asynchronous编程实现 !
它目前被称为郁金香,并且已经有一个积极的跟随 。
如PEP 3153所述:asynchronousIO支持和PEP 3156:asynchronousIO支持重新启动 :
想要用Python编写asynchronous代码的人现在有几个select:
- asyncore和asynchat;
- 一些定制的东西,很可能基于select模块;
- 使用第三方库,如Twisted或gevent 。
不幸的是,这些选项都有其不利之处,这是PEP试图解决的。
尽pipe长期以来一直是Python标准库的一部分,但asyncore模块仍然存在一些根本性的缺陷,这些缺陷来自于不灵活的API,不符合现代asynchronousnetworking模块的期望。
此外,其方法过于简单,为开发人员提供了所需的全部工具,以充分利用asynchronousnetworking的潜力。
目前生产中最stream行的解决scheme是使用第三方库。 这些通常提供了令人满意的解决scheme,但这些库之间缺乏兼容性,这往往会使得代码库与其所使用的库非常紧密地耦合。
当前在不同的asynchronousIO库之间缺乏可移植性会导致第三方库开发人员重复工作。 足够强大的抽象可能意味着asynchronous代码被写入一次,但在任何地方都可以使用。
这是对能力的简要概述 。
其他的受访者正在向你指出Twisted,这是一个非常全面的框架,但是在我看来,它有一个非pythonic的devise。 另外,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
模块提供了许多这样的原语供你使用,如果你知道如何使用它们的话。
你可能想要检出Python的Twisted库。 他们提供许多有用的工具。
- 一点底漆
- 推迟和相关的东西
您可能会看到我的Pythonasynchronous编程工具: http : //www.ideawu.com/blog/2010/08/delegate-in-pythonpython-asynchronous-programming.html
导入时间,随机,系统 从委托import* def proc(a): time.sleep(random.random()) 返回str(a) def proc_callback(handle,args = None): ret = d.end(句柄) d =委托() d.init(2)#工号 handle = d.begin(proc,'12345',proc_callback,'test') sys.stdin.readline() d.free()