puk*_*nic 7 python concurrency asynchronous celery
据我所知,异步网络框架/库如twisted,tornado和asyncio通过实现非阻塞套接字和事件循环提供异步IO.Gevent通过猴子修补标准库实现了基本相同的功能,因此不需要通过回调和协同程序进行显式异步编程.
另一方面,异步任务队列(如Celery)管理后台任务并在多个线程或机器上分配这些任务.我不完全理解这个过程,但它涉及消息代理,消息和工作者.
我的问题,
异步任务队列是否需要异步IO?它们有任何关联吗?这两个概念看似相似,但应用程序级别的实现是不同的.我认为他们唯一的共同点就是"异步"这个词,所以也许就是让我失望.
有人可以详细说明任务队列的工作方式以及消息代理之间的关系(为什么需要它们?),工作者和消息(什么是消息?字节?).
哦,我不是要解决任何具体问题,我只是想了解异步任务队列和异步IO背后的想法.
异步任务或 celery 任务只是异步执行的任务。在 celery 的特殊情况下,任务由多个工作线程执行,从而充分利用线程、多处理以及分布式节点的优势。因此,在某种程度上,我们可以通过使用像multiprocessing或 这样的库轻松完成 celery 的功能multithreading,但使用 celery 的好处是它可以自行处理所有复杂性。
现在异步IO与multithreadingor有很大不同multiprocessing。Aync IO 适用于 IO 密集型(而非 CPU)任务。它仅使用单线程同时执行多个 IO 请求。Gevent或者asyncio(对于 python 3)有助于实现这一点。
Celery - 不需要实时任务的理想选择
多处理 - 非常适合 CPU 密集型任务。
Asyncio/Gevent - IO 密集型任务的理想选择
多线程 - 由于 Python 中固有的全局解释器锁定,在 CPU 密集型程序中没有多大用处。对于 IO 密集型程序,我相信asyncio是更好的选择
Tornado - 异步执行 IO 请求的框架。
Twisted - 一个网络框架,除了异步 IO 之外,还提供许多功能。