异步任务队列和异步IO

7
据我所知,Twisted、Tornado和Asyncio等异步网络框架/库通过实现非阻塞套接字和事件循环来提供异步IO。Gevent通过猴子补丁标准库实现了基本相同的功能,因此不需要使用显式的回调和协程进行异步编程。
另一方面,像Celery这样的异步任务队列管理后台任务并在多个线程或机器上分配这些任务。我不完全了解这个过程,但它涉及消息代理、消息和工作进程。
我的问题是,
1. 异步任务队列是否需要异步IO?它们在任何方面相关吗?这两个概念似乎相似,但在应用程序级别的实现方式不同。我认为它们唯一共同之处就是“异步”这个词,所以可能会使我感到困惑。 2. 某人能否详细说明任务队列的工作原理和消息代理(为什么需要它们?)、工作进程和消息之间的关系(消息是什么?字节?)。
哦,我不是要解决任何具体问题,我只是想理解异步任务队列和异步IO背后的思想。

1
我从未听说过“异步任务队列”这个术语。显而易见的问题是:那么同步任务队列是什么?我认为这个词在这里被严重误用了。 - freakish
2个回答

3
异步IO是一种无需阻塞即可使用套接字(或更普遍的文件描述符)的方法。这个术语特指一个进程甚至一个线程。你甚至可以想象将线程与异步调用混合使用。这完全没问题,但有点复杂。
现在我不知道“异步任务队列”是什么意思。在我看来,只有一个任务队列,它是一种数据结构。您可以异步或同步地访问它。通过“访问”,我指的是“push”和“pop”调用。这些可以在内部使用网络。
因此,任务队列是一种数据结构。异步IO是一种访问它的方式。这就是全部。
“异步”这个词现在被过度使用了。炒作是真实存在的。
至于您的第二个问题:
1. 消息只是一组数据,一系列字节。它可以是任何东西。通常这些是一些结构化的字符串,比如JSON。 2. 任务==消息。使用不同的单词是为了通知该数据的目的:执行某些任务。例如,您会发送一个消息{"task": "process_image"},您的消费者将启动一个适当的函数。 3. 任务队列Q只是一个队列(数据结构)。 4. 生产者P是将消息推送到Q的进程/线程/类/函数/物体。 5. 消费者(或工作者)C是从Q中弹出消息并对其进行一些处理的进程/线程/类/函数/物体。 6. 消息代理B是重新分配消息的进程。在这种情况下,生产者P将消息发送到B(而不是直接发送到队列),然后B可以(例如)复制此消息并将其发送到2个不同的队列Q1和Q2,以便2个不同的工作者C1和C2将收到该消息。消息代理还可以充当协议转换器,可以转换消息,聚合它们并执行许多其他操作。通常它只是生产者和消费者之间的黑匣子。
正如您所看到的,这些东西没有正式的定义,您必须使用一点直觉才能完全理解它们。

2
异步任务或者 celery 任务只是异步执行的任务。特别是在 celery 的情况下,任务由多个工作进程执行,从而充分利用了线程、多进程以及分布式节点的全部优势。因此,我们可以通过使用诸如 multiprocessingmultithreading 等库轻松完成 celery 所做的事情,但使用 celery 的好处在于它自己处理所有这些复杂性。
现在,异步 I/Omultithreadingmultiprocessing 完全不同。Aync IO 适用于 IO 绑定的任务(不是 CPU)。它仅使用单个线程同时执行多个 IO 请求。在 Python 3 中,Geventasyncio 可以帮助实现这一点。
  1. Celery - 适用于不需要实时处理的任务

  2. Multiprocessing - 适用于 CPU 绑定的任务。

  3. Asyncio/Gevent - 适用于 IO 绑定的任务

  4. Multithreading - 由于 Python 中固有的全局解释器锁定,在 CPU 绑定的程序中没有太大作用。在 IO 绑定的程序中,我认为 asyncio 是更好的选择。

  5. Tornado - 一种异步执行 IO 请求的框架。

  6. Twisted - 一个网络框架,提供了除异步 I/O 外的许多功能。


我不同意第四点。Python线程是真正的线程,当正确使用时可以提高IO绑定程序的性能。它们不适用于CPU绑定工作,因为GIL仍然是一个因素。 - sberry
在IO绑定程序中,asyncio是更好的选择。 - hspandher
可能是真的,但是asyncio在Python2中不可用。 - sberry
我同意,但还有其他选择,比如 trollius、twisted 等。 - hspandher
Trollius不再维护,虽然我喜欢Twisted(已使用了8年),但它是完全不同的东西,具有相当大的学习曲线。如果有人想提高IO绑定程序的性能(其中多个IO操作可以并发运行),那么线程就很好,并且是标准库的一部分。 - sberry
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接