Celery的过期选项不起作用

dim*_*mmg 8 python celery

我正在玩Celery,我正在尝试定期完成任务CELERYBEAT_SCHEDULER.这是我的配置:

CELERY_TIMEZONE = 'Europe/Kiev'
CELERYBEAT_SCHEDULE = {
    'run-task-every-5-seconds': {
        'task': 'tasks.run_every_five_seconds',
        'schedule': timedelta(seconds=5),
        'options': {
            'expires': 10,
        }
    },
}

# the task
@app.task()
def run_every_five_seconds():
   return '5 seconds passed'
Run Code Online (Sandbox Code Playgroud)

当用celery -A celery_app beat任务运行节拍似乎没有过期.然后我读到节拍可能存在一些问题,所以它没有考虑到expires选项.

然后我尝试了一个任务,所以它被手动调用.

@app.task()
def print_hello():
    while True:
        print datetime.datetime.now()
        sleep(1)
Run Code Online (Sandbox Code Playgroud)

我用这种方式调用任务:

print_hello.apply_async(args=[], expires=5)
Run Code Online (Sandbox Code Playgroud)

工作人员的控制台告诉我我的任务将过期,但它也不会过期.它正在无限执行.

Received task: tasks.print_hello[05ee0175-cf3a-492b-9601-1450eaaf8ef7] expires:[2016-01-15 00:08:03.707062+02:00]
Run Code Online (Sandbox Code Playgroud)

有什么我做错了吗?

use*_*865 13

我认为你对这个expires论点的理解是错误的。

文档中说:“任务在过期时间后将不会执行。” 参考号 这意味着如果过期时间已过,则不会开始执行。如果执行已经开始,则执行将运行至完成。

您的配置每 5 秒向任务队列添加一个任务。如果任务加入任务队列10秒后仍未开始执行,则该任务将被丢弃。然而,任务会立即执行,因为有一个空闲的 celery 工作线程可用。

您的代码示例添加了一个任务,如果 5 秒内未开始执行,则该任务将被丢弃。

要获得您想要的功能,您可以替换'expires': 10,'expires': datetime.datetime.now() + timedelta(seconds=10),. 这会将 设定expires为绝对时间。