【发布时间】:2010-07-11 00:03:35
【问题描述】:
python 中是否存在异步编程的通用概念?我可以为一个函数分配一个回调,执行它并立即返回主程序流,不管该函数的执行需要多长时间?
【问题讨论】:
标签: python asynchronous
python 中是否存在异步编程的通用概念?我可以为一个函数分配一个回调,执行它并立即返回主程序流,不管该函数的执行需要多长时间?
【问题讨论】:
标签: python asynchronous
看这里:
Asynchronous Programming in Python
An Introduction to Asynchronous Programming and Twisted
值得一试:
asyncio (previously Tulip) has been checked into the Python default branch
今天 Python 内置了 asyncIO — Asynchronous I/O, event loop, coroutines and tasks。
来自以上链接的描述:
asyncIO 模块提供了编写单线程的基础设施 使用协程的并发代码,通过套接字多路复用 I/O 访问 和其他资源,运行网络客户端和服务器,以及其他 相关原语。这是更详细的软件包列表 内容:
- 具有各种系统特定实现的可插拔事件循环;
- 传输和协议抽象(类似于 Twisted 中的抽象);
- 具体支持 TCP、UDP、SSL、子进程管道、延迟调用、 和其他(有些可能依赖于系统);
- 模拟 concurrent.futures 模块中的 Future 类,但适用于事件循环;
- 协程和任务基于从 (PEP 380) 到 帮助以顺序方式编写并发代码;
- 取消对 Futures 和协程的支持;
- 使用的同步原语 在单个线程中的协程之间,模仿那些在 线程模块;
- 一个用于将工作传递给线程池的接口, 当你绝对,肯定地必须使用一个库时 进行阻塞 I/O 调用。
异步编程更复杂 比经典的“顺序”编程:参见Develop with asyncio page,它列出了常见的陷阱并解释了如何避免它们。使能够 开发期间的调试模式以检测常见问题。
也值得一试:
【讨论】:
其他受访者将您指向 Twisted,这是一个很棒且非常全面的框架,但在我看来,它的设计非常非 Python。此外,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
但是,在几乎所有有用的情况下,您都希望在线程之间进行通信。你应该看看synchronization primitives,熟悉concurrency的概念和相关问题。
threading 模块提供了许多这样的原语供您使用,如果您知道如何使用它们。
【讨论】:
大家好消息!
Python 3.4 将包含全新的雄心勃勃的异步编程implementation!
目前称为tulip,并且已经有一个active following。
如PEP 3153: Asynchronous IO support 和PEP 3156: Asynchronous IO Support Rebooted 中所述:
现在想用 Python 编写异步代码的人有几个选择:
不幸的是,这些选项中的每一个都有其缺点,本 PEP 试图解决这些问题。
尽管长期以来一直是 Python 标准库的一部分,但 asyncore 模块仍存在根本缺陷,原因是其 API 不灵活,无法满足现代异步网络模块的期望。
此外,它的方法过于简单,无法为开发人员提供充分利用异步网络潜力所需的所有工具。
目前在生产中使用的最流行的解决方案是使用第三方库。这些通常提供令人满意的解决方案,但这些库之间缺乏兼容性,这往往会使代码库与它们使用的库非常紧密地耦合。
目前不同异步 IO 库之间缺乏可移植性,导致第三方库开发人员需要大量重复工作。足够强大的抽象可能意味着异步代码只需编写一次,就可以在任何地方使用。
这是brief overview 的能力。
【讨论】:
您所描述的(主程序流程在另一个函数执行时立即恢复)不是通常所说的“异步”(AKA“事件驱动”)编程,而是“多任务”(AKA“多线程”或“多处理” )。您可以使用标准库模块threading 和multiprocessing 获得您所描述的内容(后者允许在多核机器上实际并发执行)。
标准 Python 库的 asyncore 和 asynchat 模块支持异步(事件驱动)编程,它们非常面向网络任务(实际上它们在内部使用 select 模块,在 Windows , 只支持套接字——尽管在 Unixy 操作系统上它也可以支持任何文件描述符)。
要获得对异步(事件驱动)编程的更通用(虽然也主要面向网络,但不限制)支持,请查看twisted 第三方包。
【讨论】:
您可能很想查看 Python 的 Twisted 库。它们提供了许多有用的工具。
【讨论】:
您可能会看到我的 Python 异步编程工具:http://www.ideawu.com/blog/2010/08/delegate-in-pythonpython-asynchronous-programming.html
导入时间,随机,系统 从委托进口 * 定义过程(一): time.sleep(random.random()) 返回 str(a) def proc_callback(handle, args=None): ret = d.end(句柄) d = 委托() d.init(2) # 工人数量 句柄 = d.begin(proc, '12345', proc_callback, 'test') sys.stdin.readline() d.free()【讨论】: