芹菜工人睡不正常

时间:2015-01-19 12:49:49

标签: python celery sleep worker

我有下一个问题,我在Python上使用一个必须等​​待X秒的进程,该进程本身正常工作,问题是当我把它作为任务放在芹菜上时。

当工作人员尝试在一个任务上执行time.sleep(X)时,它会暂停工作人员中的所有任务,例如:

我有工人A,它可以同时做4个任务(q,w,e和r),任务r有1800秒的睡眠,所以工人同时做4个任务,但当r任务进行睡眠时,工人也会停止q,w和e。

这是正常的吗?你知道我怎么能解决这个问题吗?

编辑: 这是celery.py的一个例子,我的节拍和队列

app.conf.update(
CELERY_DEFAULT_QUEUE='default',
CELERY_QUEUES=(
    Queue('search', routing_key='search.#'),
    Queue('tests', routing_key='tests.#'),
    Queue('default',    routing_key='tasks.#'),
),

CELERY_DEFAULT_EXCHANGE='tasks',
CELERY_DEFAULT_EXCHANGE_TYPE='topic',
CELERY_DEFAULT_ROUTING_KEY='tasks.default',
CELERY_TASK_RESULT_EXPIRES=10,
CELERYD_TASK_SOFT_TIME_LIMIT=1800,
CELERY_ROUTES={
    'tests.tasks.volume': {
        'queue': 'tests',
        'routing_key': 'tests.volume',
    },
    'tests.tasks.summary': {
        'queue': 'tests',
        'routing_key': 'tests.summary',
    },
    'search.tasks.links': {
        'queue': 'search',
        'routing_key': 'search.links',
    },
    'search.tasks.urls': {
        'queue': 'search',
        'routing_key': 'search.urls',
    },
},

CELERYBEAT_SCHEDULE={
    # heavy one
    'each-hour-summary': {
        'task': 'tests.tasks.summary',
        'schedule': crontab(minute='0', hour='*/1'),
        'args': (),
    },
    'each-hour-volume': {
        'task': 'tests.tasks.volume',
        'schedule': crontab(minute='0', hour='*/1'),
        'args': (),
    },
    'links-each-cuarter': {
        'task': 'search.tasks.links',
        'schedule': crontab(minute='*/15'),
        'args': (),
    },
    'urls-each-ten': {
        'schedule': crontab(minute='*/10'),
        'task': 'search.tasks.urls',
        'args': (),
    },
}
)

test.tasks.py

@app.task
def summary():
    execute_sumary() #heavy task ~ 1 hour aprox

@app.task
def volume():
    execute_volume() #no important ~ less than 5 minutes

和search.tasks.py

@app.task
def links():
    free = search_links() #return boolean
    if free:
        process_links()
    else:
        time.sleep(1080) #<--------sleep with which I have problems
    process_links()

@app.task
def urls():
    execute_urls() #no important ~ less than 1 minute

好吧,我有2个工人,A用于队列搜索,B用于测试和默认。

问题在于A,当它执行任务“链接”并执行time.sleep()时,它会停止工作人员正在执行的其他任务。

因为worker B工作正常,我认为问题是time.sleep()函数。

2 个答案:

答案 0 :(得分:3)

如果您只有一个进程/线程,则调用sleep()将阻止它。这意味着没有其他任务会运行......

答案 1 :(得分:1)

你设置CELERYD_TASK_SOFT_TIME_LIMIT = 1800,但你的睡眠是1080。 在此时间间隔内只能执行一个或两个任务。 设置CELERYD_TASK_SOFT_TIME_LIMIT&gt; (1080+(工作时间))* 3 启动芹菜工人时设置更多--concurency(&gt; 4)。