繁体   English   中英

python中的异步编程

[英]asynchronous programming in python

python中是否存在异步编程的一般概念? 我可以为一个函数分配一个回调函数,执行它并立即返回主程序流程,无论该函数的执行需要多长时间?

你描述的内容(主程序流在另一个函数执行时立即恢复)不是通常所谓的“异步”(AKA“事件驱动”)编程,而是“多任务”(AKA“多线程”或“多处理”)。 您可以使用标准库模块进行threadingmultiprocessing (后者允许在多核计算机上实际并发执行)来获得您所描述的内容。

asyncoreasynchat模块中的标准Python库支持异步(事件驱动)编程,这些模块非常面向网络任务(实际上他们在内部使用select模块,在Windows上,它只支持套接字 - 尽管在Unixy上操作系统它也可以支持任何文件描述符)。

对于更一般的(虽然也主要是面向网络,但不限于此)支持异步(事件驱动)编程,请查看扭曲的第三方软件包。

看看这里:

Python中的异步编程

异步编程和扭曲的介绍

值得一试:

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

编辑于2018年3月14日

今天Python有asyncIO - 异步I / O,事件循环,协程和内置任务

从以上链接中获取的描述:

asyncIO模块提供了使用协同程序编写单线程并发代码,通过套接字和其他资源多路复用I / O访问,运行网络客户端和服务器以及其他相关原语的基础结构。 以下是包内容的更详细列表:

  1. 一个可插入的事件循环,具有各种特定于系统的实现;
  2. 传输和协议抽象(类似于Twisted中的那些);
  3. 具体支持TCP,UDP,SSL,子进程管道,延迟调用等(有些可能与系统有关);
  4. 一个Future类,它模仿concurrent.futures模块中的那个,但适用于事件循环;
  5. 基于(PEP 380)的产量的协同程序和任务,以帮助以顺序方式编写并发代码;
  6. 对期货和协同程序的取消支持;
  7. 在单个线程中的协同程序之间使用的同步原语,模仿线程模块中的那些;
  8. 一个接口,用于将工作传递给线程池,当你绝对必须使用一个阻塞I / O调用的库时。

异步编程比传统的“顺序”编程更复杂:请参阅使用asyncio进行开发,该页面列出了常见的陷阱并解释了如何避免它们。 在开发期间启用调试模式以检测常见问题。

还值得一试:

使用asyncIO在Python中进行异步编程的指南

大家好消息!

Python 3.4将包括全新的雄心勃勃的异步编程实现

它目前被称为郁金香 ,已经有一个活跃的追随者

PEP 3153中所述:异步IO支持PEP 3156:重新启动异步IO支持

想要用Python编写异步代码的人现在有几个选择:

  • asyncore和asynchat;
  • 定制的东西,最有可能基于选择模块;
  • 使用第三方库,例如Twistedgevent

不幸的是,这些选项中的每一个都有它的缺点,这是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模块提供了许多这样的基元供您使用。

您可能想要检查Python的Twisted库。 它们提供了许多有用的工具

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

您可能会看到我的Python异步编程工具: http//www.ideawu.com/blog/2010/08/delegate-in-pythonpython-asynchronous-programming.html

import time, random, sys
from delegate import *

def proc(a):
    time.sleep(random.random())
    return str(a)

def proc_callback(handle, args=None):
    ret = d.end(handle)

d = Delegate()
d.init(2) # number of workers

handle = d.begin(proc, '12345', proc_callback, 'test')
sys.stdin.readline()

d.free()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM