【问题标题】:asynchronous programming in pythonpython中的异步编程
【发布时间】:2010-07-11 00:03:35
【问题描述】:

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

【问题讨论】:

标签: python asynchronous


【解决方案1】:

看这里:

Asynchronous Programming in Python

An Introduction to Asynchronous Programming and Twisted

值得一试:

asyncio (previously Tulip) has been checked into the Python default branch

2018 年 3 月 14 日编辑

今天 Python 内置了 asyncIO — Asynchronous I/O, event loop, coroutines and tasks

来自以上链接的描述:

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

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

异步编程更复杂 比经典的“顺序”编程:参见Develop with asyncio page,它列出了常见的陷阱并解释了如何避免它们。使能够 开发期间的调试模式以检测常见问题。

也值得一试:

A guide to asynchronous programming in Python with asyncIO

【讨论】:

  • 这不是真正的答案。
  • 其中哪一部分回答了“我可以为函数分配回调,执行它并立即返回主程序流程,无论该函数的执行需要多长时间吗?”
【解决方案2】:

其他受访者将您指向 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 模块提供了许多这样的原语供您使用,如果您知道如何使用它们。

【讨论】:

  • 虽然多处理(和多线程)很有用,但这并不意味着它可以解决所有问题,也不意味着它始终是使用主循环的事件驱动编程的良好替代品。跨度>
【解决方案3】:

大家好消息!

Python 3.4 将包含全新的雄心勃勃的异步编程implementation

目前称为tulip,并且已经有一个active following

PEP 3153: Asynchronous IO supportPEP 3156: Asynchronous IO Support Rebooted 中所述:

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

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

不幸的是,这些选项中的每一个都有其缺点,本 PEP 试图解决这些问题。

尽管长期以来一直是 Python 标准库的一部分,但 asyncore 模块仍存在根本缺陷,原因是其 API 不灵活,无法满足现代异步网络模块的期望。

此外,它的方法过于简单,无法为开发人员提供充分利用异步网络潜力所需的所有工具。

目前在生产中使用的最流行的解决方案是使用第三方库。这些通常提供令人满意的解决方案,但这些库之间缺乏兼容性,这往往会使代码库与它们使用的库非常紧密地耦合。

目前不同异步 IO 库之间缺乏可移植性,导致第三方库开发人员需要大量重复工作。足够强大的抽象可能意味着异步代码只需编写一次,就可以在任何地方使用。

这是brief overview 的能力。

【讨论】:

  • 有人真的想实现一种有用的方式在 Python 中进行异步编程,这听起来很疯狂。
  • @MestreLion:这个区域被忽略了这么久。
  • @PavelŠimerda:哪些区域被忽略了? python 中的 async io 实现还是一般编程中的 async io 概念/模式?
  • 我生活在 Python、C 和 Linux 的环境中。在这种情况下,我相信 async io 通常被忽略了,但在 Python 中更是如此。但我不是在谈论创建异步库,而是在谈论在 Python 应用程序中执行与实现无关的异步逻辑的一般方法。上面的 PEP 似乎是第一个重大进展。不过,我们变得有点闲聊,我认为我们的讨论对这个 SO 答案没有很好的补充。随时在 Freenode 上以 pavlix 的身份找到我。
【解决方案4】:

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

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

要获得对异步(事件驱动)编程的更通用(虽然也主要面向网络,但不限制)支持,请查看twisted 第三方包。

【讨论】:

    【解决方案5】:

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

    1. A little primer
    2. Defer and Related stuff

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-28
        • 2010-10-24
        • 2020-03-15
        • 2017-09-27
        相关资源
        最近更新 更多