我一直在阅读python 3中的asyncio模块,更广泛地讲述了python中的协同程序,我无法得到asyncio这么棒的工具。 我觉得你可以用协同程序做所有事情,你可以通过使用基于多处理模块的任务队列(例如芹菜)来做得更好。 是否存在协同程序优于任务队列的用例?
答案 0 :(得分:15)
不是一个正确的答案,而是一个不适合评论的提示列表:
您提到的是multiprocessing
模块(我们也考虑threading
)。假设您必须处理数百个套接字:是否可以生成数百个进程或线程?
再次,使用线程和进程:如何处理对共享资源的并发访问?锁定等机制的开销是多少?
像Celery这样的框架也增加了重要的开销。你可以用它,例如在高流量Web服务器上处理每个请求?顺便说一句,在那种情况下,谁负责处理套接字和连接(Celery的性质可以为你做那些)?
请务必阅读the rationale behind asyncio。该理由(以及其他内容)提及系统调用:writev()
- 是否比多个write()
更有效?
答案 1 :(得分:7)
添加上述答案:
如果手头的任务是I / O绑定并对共享数据进行操作,那么coroutines和asyncio可能就是这样。
另一方面,如果你有没有共享数据的CPU绑定任务,那么像Celery这样的多处理系统应该会更好。
如果手头的任务是CPU和I / O绑定并且不需要共享数据,我仍然会使用Celery。您可以在Celery中使用异步I / O!
如果您有CPU绑定任务但需要共享数据,我现在看到的唯一可行选项是将共享数据保存在数据库中。最近有一些尝试,例如pyparallel
,但它们仍在进行中。