Heroku中的Django + Celery不执行异步任务

时间:2016-08-06 20:30:25

标签: django heroku celery django-celery

我在Heroku中使用了Django + Celery,并将Celery设置为:

import djcelery
djcelery.setup_loader()
BROKER_URL = "django://"  # tell kombu to use the Django database as the message queue
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'
CELERY_ALWAYS_EAGER = False
CELERY_TIMEZONE = 'Europe/Madrid'

我在tasks.py中定义了2个任务,一个是定期的,另一个是在异步调用上执行的:

@task
def test_one_shot():
    print "One shot"

@periodic_task(run_every=crontab(minute="*/5"))
def test_periodic():
    print "Periodic"

Heroku配置了一个主Web工作者和一个辅助工作者:

web: gunicorn config.wsgi:application ON
worker: python manage.py celery worker -B -l info ON

通过此设置,我按如下方式运行test_one_shot任务:

test_one_shot.apply_async(eta=datetime.now()+timedelta(minutes=2))

虽然它看起来像是在heroku日志中注册的:

Received task: test.tasks.test_one_shot[f29c609d-b6e8-45d4-808d-2ca690f029af] eta:[2016-08-07 00:09:30.262362+02:00]

永远不会执行。另一方面,周期性任务test_periodic按预期执行。我做错了什么?

谢谢!

编辑:由于日期时间可识别问题,执行的任务未出现在日志中。但是,当以编程方式调用任务时,它永远不会被执行。

1 个答案:

答案 0 :(得分:0)

我最终更改了芹菜后端,在this guide之后在Heroku中使用RabbitMQ,问题就解决了。

基本上,我在Heroku上安装了RabbitMQ:

$ heroku addons:add cloudamqp

并为其设置新配置:

import djcelery
djcelery.setup_loader()
CELERY_TIMEZONE = 'Europe/Madrid'

BROKER_URL = env("CLOUDAMQP_URL", default="django://")
BROKER_POOL_LIMIT = 1
BROKER_CONNECTION_MAX_RETRIES = None

CELERY_TASK_SERIALIZER = "json"
CELERY_ACCEPT_CONTENT = ["json", "msgpack"]
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_ALWAYS_EAGER = False

if BROKER_URL == "django://":
    INSTALLED_APPS += ("kombu.transport.django",)