在python中的asynchronous编程

python中有asynchronous编程的一般概念吗? 我可以给一个函数分配一个callback,执行它并立即返回到主程序stream程,无论该函数执行多长时间?

看看这里:

Python中的asynchronous编程

asynchronous编程和扭曲的介绍

值得检查:

asyncio(以前的郁金香)已经被检入Python默认分支

你所描述的(主程序stream在另一个函数执行时立即恢复)并不是通常所说的“asynchronous”(AKA“事件驱动”)编程,而是“多任务”(又称“multithreading”或“多处理”)。 您可以通过标准库模块threadingmultiprocessing (后者允许在多核机器上实际并发执行)获得您所描述的内容。

asynchronous(事件驱动)编程在asyncoreasynchat模块的标准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库。 他们提供许多有用的工具。

  1. 一点底漆
  2. 推迟和相关的东西

您可能会看到我的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()