芹菜工人不填补并发插槽

我有一名工人,并发性为4.我看到在花中启动了4个过程,而且一切看起来都很好.

如果我在shell中执行此操作,那么我会看到4个工作程序执行任务,其余任务被保留,并且每次处理4个,直到队列为空.

[my_task.apply_async() for i in xrange(10)]

但是,如果我逐行执行此操作,则只会积极处理前两个任务,从那时起,它一次只能处理两个任务.

my_task.apply_async()
my_task.apply_async()
my_task.apply_async()
my_task.apply_async()
...

有任何想法吗?

解决方法:

通常这是由于子进程填满了并发槽.默认情况下,Celery使用prefork作为执行池,并且每次生成任务的子流程(另一个fork)时,它都会被视为正在运行并填充并发插槽的流程.

避免这种情况的最简单方法是在using eventlet之前,它允许您在每个任务上产生多个异步调用.但是,这要求您的所有任务都没有阻塞调用,例如subprocess.communicate,因为它们将阻塞所有任务.

否则,如果您有必要的阻塞调用,并且知道您的任务一次只会有一个正在运行的子进程,则可以将CELERYD_CONCURRENCY设置为double(8)并设置任务的开始时间限制,因此赢得了8个任务不能马上开始(例如@ app.task(rate_limit = ’10 / m’)).但是,这有点麻烦,使用eventlet绝对是首选.

上一篇:Python-将芹菜用于管道


下一篇:python-使芹菜返回未来