据我所知,异步网络框架/库(如twisted,tornado和asyncio)通过实现非阻塞套接字和事件循环来提供异步IO。 Gevent通过猴子修补标准库实现了基本相同的功能,因此不需要通过回调和协同程序进行显式异步编程。
另一方面,异步任务队列(如Celery)管理后台任务并在多个线程或机器上分配这些任务。我不完全理解这个过程,但它涉及消息代理,消息和工作者。
我的问题,
异步任务队列是否需要异步IO?它们有任何关联吗?这两个概念看似相似,但应用程序级别的实现是不同的。我认为他们唯一的共同点是“异步”这个词,所以也许就是让我失望。
有人可以详细说明任务队列的工作方式以及消息代理之间的关系(为什么需要它们?),工作者和消息(什么是消息?字节?)。
哦,我不是要解决任何具体问题,我只是想了解异步任务队列和异步IO背后的想法。
答案 0 :(得分:2)
异步任务或芹菜任务只是异步执行的任务。在芹菜的特殊情况下,任务由多个工作人员执行,从而充分利用线程,多处理以及分布式节点。所以在某种程度上,我们可以通过使用像multiprocessing
或multithreading
这样的库来轻松完成芹菜所做的事情,但使用芹菜的好处是它自己处理所有这些复杂性。
现在Asyncronous IO与multithreading
或multiprocessing
完全不同。 Aync IO适用于IO绑定的任务(不是CPU)。它仅使用单线程同时执行多个IO请求。 Gevent
或asyncio
(如果是python 3)有助于实现这一点。
芹菜 - 非常适合不需要实时的任务
多处理 - 适用于受CPU限制的任务。
Asyncio / Gevent - 适用于IO绑定的任务
多线程 - 由于Python中固有的全局解释器锁定,在CPU绑定程序中没有太多用处。对于IO绑定程序,我相信asyncio
是更好的选择
Tornado - 异步执行IO请求的框架。
Twisted - 一种除了异步IO之外还提供许多功能的网络框架。
答案 1 :(得分:2)
异步IO是一种在不阻塞的情况下使用套接字(或更常见的文件描述符)的方法。该术语特定于一个进程或甚至一个线程。你甚至可以想象用异步调用混合线程。它会完全没问题,但有些复杂。
现在我不知道asynchronous task queue
的含义。恕我直言那里只有一个任务队列,它是一个数据结构。您可以以异步或同步方式访问它。通过"访问"我的意思是push
和pop
来电。这些可以在内部使用网络。
因此任务队列是一种数据结构。 (A)同步IO是一种访问它的方法。这就是它的一切。
现在,术语asynchronous
过度使用了。炒作是真实的。
至于你的第二个问题:
{"task": "process_image"}
,您的消费者将触发相应的功能。正如您所看到的,对这些事情没有正式的定义,您必须使用一些直觉来完全理解它们。