Celery-Django:无法异步执行任务

4 投票
1 回答
1557 浏览
提问于 2025-04-17 02:47

我想在用户浏览我的网站时在后台运行一些任务,但每当我使用Celery调用一个函数时,它似乎是同步执行的,而不是异步的。

比如,当我调用 function.delay() 时,整个网站都会卡住,直到 function.delay() 返回结果。其他类似的调用方法(如 apply_async、子任务)也有同样的问题。

我猜可能是Django或Celery的某些配置出了问题,但我不知道具体是什么。

在 settings.py 中的 Celery 配置:

import djcelery
djcelery.setup_loader()

CELERY_RESULT_BACKEND = "amqp"
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "test"
BROKER_PASSWORD = "test"
BROKER_VHOST = "testhost"

TEST_RUNNER = "djcelery.contrib.test_runner.run_tests"

CELERY_IMPORTS = ("myapp.tasks",)

BROKER_BACKEND = "memory"
CELERY_ALWAYS_EAGER = True

我尝试用 "./manage.py celeryd" 启动 Celery 守护进程,但得到了以下输出:

[2011-09-23 09:25:38,026: WARNING/MainProcess]  

 -------------- celery@iMac.local v2.2.7
---- **** -----
--- * ***  * -- [Configuration]
-- * - **** ---   . broker:      memory://test@localhost:5672/testhost
- ** ----------   . loader:      djcelery.loaders.DjangoLoader
- ** ----------   . logfile:     [stderr]@WARNING
- ** ----------   . concurrency: 4
- ** ----------   . events:      OFF
- *** --- * ---   . beat:        OFF
-- ******* ----
--- ***** ----- [Queues]
 --------------   . celery:      exchange:celery (direct) binding:celery


[2011-09-23 09:25:38,035: WARNING/MainProcess] celery@iMac.local has started.

1 个回答

8

试着去掉

CELERY_ALWAYS_EAGER = True

你现在是明确要求celery以同步的方式来执行任务。这意味着它会一直等着结果出来。这个设置在写单元测试等情况下是很有用的。

可以看看 http://ask.github.com/celery/configuration.html

撰写回答