【发布时间】:2018-07-18 02:05:41
【问题描述】:
我正在尝试使用my_task.delay() 在 Django 视图中运行 celery 任务。但是,该任务永远不会执行,并且代码在该行被阻塞并且视图永远不会呈现。我正在使用 AWS SQS 作为代理,并且具有对 SQS 的完全访问权限的 IAM 用户。
我做错了什么?
运行 celery 和 Django
我正在这样运行芹菜:
celery -A app worker -l info
我正在另一个终端本地启动我的 Django 服务器:
python manage.py runserver
celery 命令输出:
-------------- celery@LAPTOP-02019EM6 v4.1.0 (latentcall)
---- **** -----
--- * *** * -- Windows-10-10.0.16299 2018-02-07 13:48:18
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: app:0x6372c18
- ** ---------- .> transport: sqs://**redacted**:**@localhost//
- ** ---------- .> results: disabled://
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ---- .> task events: OFF
--- ***** -----
-------------- [queues]
.> my-queue exchange=my-queue(direct) key=my-queue
[tasks]
. app.celery.debug_task
. counter.tasks.my_task
[2018-02-07 13:48:19,262: INFO/MainProcess] Starting new HTTPS connection (1): sa-east-1.queue.amazonaws.com
[2018-02-07 13:48:19,868: INFO/SpawnPoolWorker-1] child process 20196 calling self.run()
[2018-02-07 13:48:19,918: INFO/SpawnPoolWorker-4] child process 19984 calling self.run()
[2018-02-07 13:48:19,947: INFO/SpawnPoolWorker-3] child process 16024 calling self.run()
[2018-02-07 13:48:20,004: INFO/SpawnPoolWorker-2] child process 19572 calling self.run()
[2018-02-07 13:48:20,815: INFO/MainProcess] Connected to sqs://**redacted**:**@localhost//
[2018-02-07 13:48:20,930: INFO/MainProcess] Starting new HTTPS connection (1): sa-east-1.queue.amazonaws.com
[2018-02-07 13:48:21,307: WARNING/MainProcess] c:\users\nicolas\anaconda3\envs\djangocelery\lib\site-packages\celery\fixups\django.py:202: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!
warnings.warn('Using settings.DEBUG leads to a memory leak, never '
[2018-02-07 13:48:21,311: INFO/MainProcess] celery@LAPTOP-02019EM6 ready.
views.py
from .tasks import my_task
def index(request):
print('New request') # This is called
my_task.delay()
# Never reaches here
return HttpResponse('test')
tasks.py
...
@shared_task
def my_task():
print('Task ran successfully') # never prints anything
settings.py
我的配置如下:
import djcelery
djcelery.setup_loader()
CELERY_BROKER_URL = 'sqs://'
CELERY_BROKER_TRANSPORT_OPTIONS = {
'region': 'sa-east-1',
}
CELERY_BROKER_USER = '****************'
CELERY_BROKER_PASSWORD = '***************************'
CELERY_TASK_DEFAULT_QUEUE = 'my-queue'
版本:
我使用以下版本的 Django 和 Celery:
Django==2.0.2
django-celery==3.2.2
celery==4.1.0
感谢您的帮助!
【问题讨论】:
-
还要注意,即使我使用默认队列,我也会遇到同样的问题。在这种情况下,将在 SQS 中创建 celery 队列,但是使用 .delay 调用任务时代码仍然会卡住
-
你找到解决办法了吗?
-
@butteredtoast:我还没有,但我已经在另一个项目中成功地使用了 celery 和 django。我没有为这个宠物项目尝试过的两件事,但后来我成功使用了:1)在 Windows 上,使用
eventlet选项和 2)安装pycurl(不确定我是否有它)。对于我目前使用的 celery,我也在使用 RabbitMQ(通过 CloudAMPQ 服务)而不是 Amazon SQS。
标签: django celery amazon-sqs django-celery