Celery + Gevent池在1000多个任务执行后挂起

时间:2015-02-24 07:23:53

标签: python celery gevent celery-task

我们有8个核心,16 GB内存,运行芹菜的Linux服务器, 它正在运行芹菜工作队列myQueue,并在gevent池下运行1000并发。

执行约1小时的任务后,工作人员突然冻结,不接受来自celery beat的新任务 这是我们对芹菜的配置

App =  Celery('tasks')
class Conf:
   BROKER_URL   = 'amqp://<user>:<pass>@<host>:<port>/<vhost>'
   CELERY_IGNORE_RESULT = True
   CELERY_IMPORTS = ("worker_class",)
   CELERYBEAT_SCHEDULE = {
       'RunTask':{
           'task': 'tasks.worker.MyWorker',
           'schedule' : timedelta(minutes=5)
       }
   }

App.config_from_object(CONF)

我们正在运行像下面的芹菜

celery worker --workdir=tasks/ -A worker -P gevent -c 1000 -Q myQueue --loglevel=INFO

也有人可以解释如何使用celery multi

来使用gevent池

1 个答案:

答案 0 :(得分:2)

使用celery multi指定池类型:

celery -A myApp multi start 4 -l INFO -P gevent -c 1000 -Q myQueue

上面的命令启动了4个gevent worker,每个工作的并发级别为1000,并且所有工作都来自 myQueue

但这并不是乐趣结束的地方,因为你甚至可以指定每个工作者的并发性,并指定每个工作者消耗的队列。例如:

celery -A myApp multi start 4 -l INFO -P gevent -c:1-3 1000 -c:4 200 -Q:1-2 myQueue1 -Q:3 myQueue2 -Q:4 myQueue3

就像之前我们启动4个gevent worker一样,但是现在worker 1到3的并发性为1000,而最后一个worker的并发性为200.此外,worker 1和2使用 myQueue1 , worker 3从 myQueue2 消耗,而worker 4消耗来自 myQueue4

注意:celery worker选项适用于celery multi