python - celery worker sleep 无法正常工作

标签 python celery sleep worker

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

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

我有 worker A,它可以同时做 4 个任务(q、w、e 和 r),任务 r 有 1800 秒的 sleep ,所以 worker 同时做 4 个任务,但是当 r 任务执行 sleep 时,worker 也会停止 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': (),
    },
}
)

测试任务.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() 函数上。

最佳答案

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

关于python - celery worker sleep 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28025053/

相关文章:

javascript - 如何在 Django View 执行时停止它?

Android Java 服务和定时器/线程休眠

c++ - Visual Studio 2010 c++ sleep ()

python - Python 中的 MongoDB 通知

python - 如何使用由南管理的现有应用程序设置 django-hstore?

python - 为什么 str.encode ('ascii' ) 不适用于这种情况?

python - celery worker 失踪

django + celery - 如何在我的 django 应用程序中为 celery 设置 crontab 计划?

python - CELERYBEAT_SCHEDULE 在你的项目中放在哪里?

java - 类实现 Runnable 但未定义 start() 和 sleep() 方法