异步IO和协程 vs 任务队列

27

我一直在学习Python 3中的asyncio模块,以及更广泛地了解Python中的协程,但我不知道asyncio为什么是一个如此强大的工具。

我有一种感觉,所有可以使用协程完成的任务,都可以通过使用基于multiprocessing模块的任务队列(例如celery)更好地完成。

是否存在比任务队列更适合使用协程的用例?

2个回答

25

不是一个正式的答案,而是一系列提示的列表,这些提示无法放入评论中:

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

  • 再次强调,对于线程和进程:如何处理对共享资源的并发访问?像锁定这样的机制的开销是多少?

  • 像Celery这样的框架也会增加重要的开销。你能否将其用于处理高流量Web服务器上的每个请求?顺便说一句,在那种情况下,谁负责处理套接字和连接(Celery的性质不能替你完成)?

  • 一定要阅读异步IO背后的原理。那个原理(除其他外)提到了系统调用:writev()——难道这比多个write()更有效率吗?


18

补充上面的答案:

如果任务是I/O绑定的并且操作共享数据,协程和asyncio可能是可行的方式。

另一方面,如果您有CPU绑定任务而数据不是共享的,则类似Celery的多处理系统应该更好。

如果任务既是CPU和I/O绑定的并且不需要共享数据,我仍然会使用Celery。您可以从Celery内部使用async I/O!

如果您有一个CPU绑定的任务但需要共享数据,则我现在看到的唯一可行的选项是将共享数据保存在数据库中。最近有尝试使用pyparallel等工具,但它们仍处于进行中。


2
如何在Celery中使用异步I/O?您能否指导我一些有用的资料?谢谢。 - ravi malhotra
@bhaskrc @ravimalhotra 如果你知道如何在Celery中使用asyncio,请分享一下。我正在使用asgiref包的async_to_sync函数来实现相同的功能。 例如:https://github.com/aman199002/task_schedular/blob/main/celery_stuff/tasks.py - Aman Garg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接