异步任务队列和异步IO

时间:2016-04-09 14:50:11

标签: python asynchronous concurrency celery

据我所知,异步网络框架/库(如twisted,tornado和asyncio)通过实现非阻塞套接字和事件循环来提供异步IO。 Gevent通过猴子修补标准库实现了基本相同的功能,因此不需要通过回调和协同程序进行显式异步编程。

另一方面,异步任务队列(如Celery)管理后台任务并在多个线程或机器上分配这些任务。我不完全理解这个过程,但它涉及消息代理,消息和工作者。

我的问题,

  1. 异步任务队列是否需要异步IO?它们有任何关联吗?这两个概念看似相似,但应用程序级别的实现是不同的。我认为他们唯一的共同点是“异步”这个词,所以也许就是让我失望。

  2. 有人可以详细说明任务队列的工作方式以及消息代理之间的关系(为什么需要它们?),工作者和消息(什么是消息?字节?)。

  3. 哦,我不是要解决任何具体问题,我只是想了解异步任务队列和异步IO背后的想法。

2 个答案:

答案 0 :(得分:2)

异步任务或芹菜任务只是异步执行的任务。在芹菜的特殊情况下,任务由多个工作人员执行,从而充分利用线程,多处理以及分布式节点。所以在某种程度上,我们可以通过使用像multiprocessingmultithreading这样的库来轻松完成芹菜所做的事情,但使用芹菜的好处是它自己处理所有这些复杂性。

现在Asyncronous IOmultithreadingmultiprocessing完全不同。 Aync IO适用于IO绑定的任务(不是CPU)。它仅使用单线程同时执行多个IO请求。 Geventasyncio(如果是python 3)有助于实现这一点。

  1. 芹菜 - 非常适合不需要实时的任务

  2. 多处理 - 适用于受CPU限制的任务。

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

  4. 多线程 - 由于Python中固有的全局解释器锁定,在CPU绑定程序中没有太多用处。对于IO绑定程序,我相信asyncio是更好的选择

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

  6. Twisted - 一种除了异步IO之外还提供许多功能的网络框架。

答案 1 :(得分:2)

异步IO是一种在不阻塞的情况下使用套接字(或更常见的文件描述符)的方法。该术语特定于一个进程或甚至一个线程。你甚至可以想象用异步调用混合线程。它会完全没问题,但有些复杂。

现在我不知道asynchronous task queue的含义。恕我直言那里只有一个任务队列,它是一个数据结构。您可以以异步或同步方式访问它。通过"访问"我的意思是pushpop来电。这些可以在内部使用网络。

因此任务队列是一种数据结构。 (A)同步IO是一种访问它的方法。这就是它的一切。

现在,术语asynchronous过度使用了。炒作是真实的。

至于你的第二个问题:

  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将获得该消息信息。消息代理还可以充当协议转换器,可以转换消息,聚合它们并执行许多操作。一般来说,它只是生产者和消费者之间的黑盒子。
  7. 正如您所看到的,对这些事情没有正式的定义,您必须使用一些直觉来完全理解它们。