Python中的异步编程

58 投票
6 回答
65662 浏览
提问于 2025-04-16 01:06

在Python中,有没有一种通用的异步编程概念?我能否给一个函数指定一个回调函数,然后立即执行这个回调,接着返回到主程序的流程中,而不管这个函数的执行需要多长时间?

6 个回答

19

大家好,带来好消息!

Python 3.4将会加入全新的、雄心勃勃的异步编程实现

现在这个新功能叫做tulip,已经有了一群活跃的支持者

根据PEP 3153:异步IO支持PEP 3156:异步IO支持重启的描述:

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

  • asyncore和asynchat;
  • 一些定制的东西,通常基于select模块;
  • 使用第三方库,比如Twistedgevent

可惜的是,这些选择都有一些缺点,而这个PEP试图解决这些问题。

尽管asyncore模块已经在Python标准库中存在很长时间,但它存在一些根本性的问题,因为它的API不够灵活,无法满足现代异步网络模块的需求。

而且,它的设计过于简单,无法为开发者提供充分利用异步网络潜力所需的所有工具。

目前在生产环境中最流行的解决方案是使用第三方库。这些库通常能提供不错的解决方案,但它们之间缺乏兼容性,导致代码往往与所用的库紧密耦合。

这种不同异步IO库之间缺乏可移植性,给第三方库的开发者带来了很多重复的工作。如果有一个足够强大的抽象层,异步代码可以一次编写,但可以在任何地方使用。

这里是它的简要概述

59

你所描述的情况(主程序在另一个函数执行时立即恢复运行)其实并不算是我们通常说的“异步”编程(也叫“事件驱动”编程),而是“多任务”编程(也叫“多线程”或“多进程”)。你可以通过标准库中的 threadingmultiprocessing 模块实现你所说的效果(后者可以在多核机器上实现真正的并行执行)。

异步(事件驱动)编程在标准的Python库中是通过 asyncoreasynchat 模块来支持的,这些模块主要用于网络任务(实际上它们内部使用了 select 模块,而在Windows上,这个模块只支持套接字——不过在类Unix系统上,它也可以支持任何文件描述符)。

如果你想要更通用的异步(事件驱动)编程支持(虽然大部分还是与网络相关,但并不局限于此),可以看看 twisted 这个第三方包。

39

看看这里:

Python中的异步编程

异步编程和Twisted简介

值得一看:

asyncio(之前叫Tulip)已经被加入到Python的默认分支中

编辑于2018年3月14日

现在Python内置了asyncIO——异步输入输出、事件循环、协程和任务

以下是从上面链接中摘录的描述:

asyncIO模块提供了一个基础设施,用于编写单线程的并发代码,使用协程、在套接字和其他资源上进行多路复用输入输出、运行网络客户端和服务器,以及其他相关的基本功能。以下是这个包的更详细内容:

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

异步编程比传统的“顺序”编程要复杂:请查看使用asyncio开发页面,其中列出了常见的陷阱,并解释了如何避免它们。在开发过程中启用调试模式,以便发现常见问题。

同样值得一看:

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

撰写回答