从信号调用芹菜任务

Call celery task from signal

我需要在用户注册后从多个 public API 导入数据。包含 django-allauth,我已经注册了一个信号处理程序,以便在 allaut 发出 user_signed_up 后调用正确的方法。 因为数据导入时间比较长,而且请求被信号阻塞了,所以想用celery来做。

我的测试任务:

@app.task()
def test_task(username):
    print('##########################Foo#################')
    sleep(40)
    print('##########################' + username + '#################')
    sleep(20)
    print('##########################Bar#################')
    return 3

我这样调用任务:

from game_studies_platform.taskapp.celery import test_task

@receiver(user_signed_up)
def on_user_signed_in(sender, request, *args, **kwargs):
    test_task.apply_async('John Doe')

应将任务放入队列中,并立即执行请求。但是被屏蔽了,等一下

该项目是使用 https://github.com/pydanny/cookiecutter-django 设置的,我 运行 它在 docker 容器中。 Celery 配置为在开发中使用 django 数据库,但在生产中将使用 redis

解决方案是在 local.py 中将 CELERY_ALWAYS_EAGER = True 切换为 False。我在 cookiecutter-django 的 Gitter 频道中被指出了那个解决方案。

上面提到的调用已经正确了。