问题 asyncio和coroutines vs任务队列


我一直在阅读python 3中的asyncio模块,更广泛地讲述了python中的协同程序,我无法得到使asyncio成为如此优秀工具的原因。 我觉得你可以用协同程序做所有事情,你可以通过使用基于多处理模块(例如celery)的任务队列来做得更好。 是否存在协同程序优于任务队列的用例?


2882
2017-12-23 14:31


起源



答案:


不是一个正确的答案,而是一个不适合评论的提示列表:

  • 你提到了 multiprocessing 模块(让我们考虑一下 threading 太)。假设你必须处理数百个套接字:你能产生数百个进程或线程吗?

  • 同样,使用线程和进程:如何处理对共享资源的并发访问?锁定等机制的开销是多少?

  • 像Celery这样的框架也增加了重要的开销。你可以用它,例如处理 每一个请求 在高流量的Web服务器上?顺便说一句,在那种情况下,谁负责处理套接字和连接(Celery的性质不能为你做到这一点)?

  • 一定要阅读 asyncio背后的基本原理。该理由(除其他外)提到系统调用: writev()  - 效率不比多重效率高 write()S'


11
2017-12-23 15:13





加上以上答案:

如果手头的任务是I / O绑定并对共享数据进行操作,那么coroutines和asyncio可能就是这样。

另一方面,如果您没有共享数据的CPU绑定任务,那么像Celery这样的多处理系统应该会更好。

如果手头的任务是CPU和I / O绑定并且不需要共享数据,我仍然会使用Celery。您可以在Celery中使用异步I / O!

如果您有一个CPU绑定任务但需要共享数据,那么我现在看到的唯一可行选项是将共享数据保存在数据库中。最近有一些尝试 pyparallel 但他们仍在进行中。


2
2018-02-11 19:06