我在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
按预期执行。我做错了什么?
谢谢!
编辑:由于日期时间可识别问题,执行的任务未出现在日志中。但是,当以编程方式调用任务时,它永远不会被执行。
答案 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",)