2015-02-24 183 views
3

我们有8个内核,16 GB内存,运行芹菜的Linux服务器, 它运行一个芹菜工作队列myQueue,并在gevent池下运行1000个并发。执行1000个任务后,Celery + Gevent池挂起

执行任务约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 

也可以有人解释我怎么可以使用gevent池使用celery multi

回答

1

要使用celery multi指定池类型:

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

上述命令开始4名GEVENT工人每个工作具有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工人,但现在摆在工人1至3有1000并发,而最后一名工人有200同时并发,工人1和2 myQueue1消耗,工人3从myQueue2消耗,并且工人4从myQueue4消耗

注意:celery worker选项使用celery multi