【问题标题】:Celery task blocked in Django view with a AWS SQS brokerCelery 任务在 Django 视图中被 AWS SQS 代理阻止
【发布时间】: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


【解决方案1】:

有点晚了,但也许你还有兴趣。我在运行 Django 和 SQS 的情况下运行了 Celery,并且在您的代码中看不到任何错误。也许您错过了 celery.py 文件中的某些内容?这是我的比较代码。

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoappname.settings')

# do not use namespace because default amqp broker would be called
app = Celery('lsaweb')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks()

您是否也检查过 SQS 是否正在接收消息(尝试在 SQS 管理区域中进行轮询)?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2019-07-02
    • 2020-12-18
    • 2013-08-30
    • 2018-01-02
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多