据我所知,异步网络框架/库,如twisted、toronto和asyncio,通过实现非阻塞套接字和事件循环来提供异步IO。Gevent通过monkey修补标准库实现了本质上相同的功能,因此不需要通过回调和协程进行显式异步编程。
另一方面,异步任务队列(如Celery)管理后台任务,并将这些任务分布在多个线程或机器上。我不完全理解这个过程,但它涉及消息代理、消息和工作人员。
我的问题,
-
异步任务队列是否需要异步IO?它们有任何关系吗?这两个概念看起来很相似,但应用程序级别的实现不同。我认为他们唯一的共同点是"异步"这个词,所以也许这让我很反感
-
有人能详细说明任务队列是如何工作的,以及消息代理(为什么需要它们?)、工作者和消息(什么是消息?字节?)之间的关系吗。
哦,我并没有试图解决任何特定的问题,我只是想了解异步任务队列和异步IO背后的想法。
异步IO是一种使用套接字(或更常见的文件描述符)而不阻塞的方法。这个术语特定于一个进程甚至一个线程。您甚至可以想象将线程与异步调用混合使用。这将是完全好的,但有点复杂。
现在我不知道asynchronous task queue
是什么意思。IMHO只有一个任务队列,它是一个数据结构。您可以以异步或同步方式访问它。我所说的"访问"是指push
和pop
调用。这些可以在内部使用网络。
所以任务队列是一个数据结构。(A) 同步IO是访问它的一种方式。这就是它的一切。
asynchronous
一词如今被过度使用。炒作是真实的。
至于你的第二个问题:
- 消息只是一组数据,一个字节序列。它可以是任何东西。通常这些是一些结构化字符串,比如JSON
- 任务==消息。另一个词用于通知数据的用途:执行某些任务。例如,您将发送一条消息
{"task": "process_image"}
,您的消费者将启动适当的功能 - 任务队列Q只是一个队列(数据结构)
- 生产者P是一个将消息推送给Q的进程/线程/类/函数/事物
- 使用者(或工作者)C是一个进程/线程/类/函数/事物,它从Q弹出消息并对其进行一些处理
- 消息代理B是一个重新分发消息的过程。在这种情况下,生产者P向B发送消息(而不是直接向队列),然后B可以(例如)复制该消息并发送到2个不同的队列Q1和Q2,使得2个不同工作者C1和C2将获得该消息。消息代理还可以充当协议翻译器,可以转换消息、聚合消息并执行许多事情。一般来说,它只是生产者和消费者之间的一个黑盒子
正如你所看到的,这些东西没有正式的定义,你必须用一点直觉来完全理解它们。
异步任务或芹菜任务只是异步执行的任务。在芹菜的特殊情况下,任务由多个工作者执行,从而充分利用了线程、多处理以及分布式节点的优势。因此,在某种程度上,我们可以通过使用像multiprocessing
或multithreading
这样的库来轻松地完成芹菜的功能,但使用芹菜的好处是它可以自己处理所有这些复杂性。
现在异步IO与multithreading
或multiprocessing
有很大不同。Aync IO适用于IO绑定(而非CPU)的任务。它只使用单个线程同时执行多个IO请求。Gevent
或asyncio
(在python 3的情况下)有助于实现这一点。
-
芹菜-不需要实时的任务的理想选择
-
多处理器处理-非常适合CPU限制的任务。
-
Asyncio/Gevent-适用于IO绑定的任务
-
多线程-由于Python中固有的全局解释器锁定,在CPU绑定程序中没有太多用处。在IO绑定程序的情况下,我认为
asyncio
是的更好选择 -
Tornado-异步执行IO请求的框架。
-
Twisted-一个除了异步IO之外还提供许多功能的网络框架。