我们有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
答案 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
。