我有几个处理API请求的任务。API实际上可能需要相当长的时间来响应。5 -10秒并不罕见。
我如何决定哪个值是合理的worker_concurrency
为io绑定任务?
文档只是声明:
同时执行任务的工作进程/线程数/绿线程数。
如果你做的主要是I/O,你可以有更多的进程,但如果主要是cpu限制,尽量保持它接近你的机器上的cpu数量。如果不设置,则使用主机的cpu/核数。
如果我选择的数字太高会发生什么?从概念上讲,我预计操作系统将在线程之间频繁切换,以至于(在某些时候)线程切换本身成为一个高CPU负载。或者还有更多的原因?
读到这里,我认为我应该使用eventlet来完成io绑定任务:
celery -A proj worker -P eventlet - concurrent =500
worker_concurrency
与--concurrency
是否相同?
我偶然发现了同样的问题。因此,正如您在这篇博文中所读到的,这种情况下的并发性意味着Greenlets
或green threads
的数量。所以它们之间的切换和threads
之间的切换是不一样的,因为每个green threads
"自愿或明确地在代码的指定点放弃对彼此的控制">
和
" greenlet在应用程序空间管理,而不是在内核空间管理。">
如你所读的博文所述。
另一方面,线程之间的切换是由底层操作系统的task scheduler
完成的。因此,记住这一点,这不是一个可以通过给你一个数字来回答的问题。
在我看来,您使用的green threads
的数量应该针对您的场景和执行您的芹菜任务的机器进行测试,以便获得最佳性能。可以从25开始,然后是100、500、1000等等,以大致了解程序完全执行所需的不同时间。
此外,您不仅可以使用eventlet池测试程序的性能,还可以使用非常相似但不相同的gevent池测试程序的性能。