草庐IT

django - celery 任务 .get() 不工作

coder 2023-11-08 原文

我将非常感谢对此的帮助!

这是我第一次尝试在 Docker 容器中将 Celery 与 Django 结合使用,经过数小时的阅读和试​​验,我无法解决这个问题。

问题

我可以从 polls.task 导入任务并使用 .delay() 运行它,如下所示:

python manage.py shell
from polls.tasks import add
task = add.delay(4,4)

当我运行它时,我可以通过 rabbitmq 容器看到一条消息。

如果我执行task.id,我可以获得任务id。

但是,如果我运行 task.get()程序就会挂起。我没有看到对任何容器采取任何行动,也没有得到任何结果。

我还注意到,当我运行 dc-up 并启动​​所有容器时,我在工作容器上得到以下输出,这似乎是正确的,包括能够看到我的任务已注册:

worker      |  -------------- default@5d0902ad9e2a v4.1.0 (latentcall)
worker      | ---- **** ----- 
worker      | --- * ***  * -- Linux-4.9.87-linuxkit-aufs-x86_64-with-debian-8.10 2018-03-30 09:45:01
worker      | -- * - **** --- 
worker      | - ** ---------- [config]
worker      | - ** ---------- .> app:         composeexample:0x7f2f3255e320
worker      | - ** ---------- .> transport:   amqp://admin:**@rabbitmq:5672//
worker      | - ** ---------- .> results:     redis://redis:6379/0
worker      | - *** --- * --- .> concurrency: 2 (prefork)
worker      | -- ******* ---- .> task events: ON
worker      | --- ***** ----- 
worker      |  -------------- [queues]
worker      |                 .> default          exchange=default(direct) key=default
worker      | 
worker      | [tasks]
worker      |   . polls.tasks.add
worker      | [2018-03-30 10:45:34,722: INFO/MainProcess] Connected to amqp://admin:**@rabbitmq:5672//
worker      | [2018-03-30 10:45:34,746: INFO/MainProcess] mingle: searching for neighbors
worker      | [2018-03-30 10:45:35,799: INFO/MainProcess] mingle: all alone
worker      | [2018-03-30 10:45:35,827: INFO/MainProcess] default@a7d75a442646 ready.

我怀疑我缺少 rabbitmq 和 worker 之间的某种形式的通信。我还想知道我是否只是错误地启动了工作人员,或者根本没有。我真的不知道。

我仔细检查了我的环境变量是否在 django 和 worker 容器中设置。

设置

我在 Docker 中有以下设置:Django、Redis(用于后端)、RabbitMQ(用于消息)、PSQL、Celery( worker 的单独容器)

这是我的 Dockerfile:

FROM python:3
ENV PYTHONUNBUFFERED 1

ADD requirements.txt /code/

WORKDIR /code/

RUN apt-get update && apt-get install -y \
    sudo \
    git

RUN pip install --upgrade pip && pip install -r requirements.txt

# create unprivileged user
RUN adduser --disabled-password --gecos '' myuser

这是我的 docker-compose.yml:

version: '3'

services:
  dbtest:
    image: postgres:10.1
    container_name: postgrestest
    expose:
      - "5432"
    volumes:
      - postgres_data:/var/lib/postgresl/data/
    networks:
      - lofi
  redis:
    image: redis:4.0.8
    container_name: redis
    networks:
      - lofi
  rabbitmq:
    image: rabbitmq:3.7.4
    container_name: rabbitmq
    env_file: .env
    ports:
      - "5672:5672"  # we forward this port because it's useful for debugging
      - "15672:15672"  # here, we can access rabbitmq management plugin
    networks:
      - lofi
  django:
    container_name: djcelerytest
    env_file: .env
    build:
      context: .
      dockerfile: Dockerfile
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
      - "8888:8888"
    depends_on:
      - dbtest
      - rabbitmq
    networks:
      - lofi
  worker:
    env_file: .env
    build:
      context: .
      dockerfile: Dockerfile
    container_name: worker
    command: sh ./run_celery.sh
    volumes:
      - .:/code
    depends_on:
      - rabbitmq
      - redis
    networks:
      - lofi

networks:
  lofi:

volumes:
  postgres_data:
    external: true

我在 .env 文件中有以下设置,用于设置 Django 和 worker 容器:

CELERY_BROKER_URL=amqp://admin:mypass@rabbitmq//
CELERY_RESULT_BACKEND=redis://redis:6379/0
RABBITMQ_DEFAULT_USER=admin
RABBITMQ_DEFAULT_PASS=mypass

这是 run_celery.sh 文件:

#!/bin/sh

# wait for RabbitMQ server to start
sleep 10

# run Celery worker for our project myproject with Celery configuration stored in Celeryconf
su -m myuser -c "celery worker -E -A composeexample.celeryconf -Q default -n default@%h  --loglevel=INFO"

我要运行的任务在 tasks.py 中:

from composeexample.celeryconf import app
from .models import AddStore

@app.task
def add(x, y):
    value = x + y
    new = AddStore(value=value)
    new.save()
    return value

最佳答案

事实证明,在 run_celery.sh 文件中,我启动 celery worker 的命令包括 -Q default 选项,该选项不再存在到 docs .

所以如果你简单地改变它:

su -m myuser -c "celery worker -E -A composeexample.celeryconf -Q default -n default@%h  --loglevel=INFO"

为此:

su -m myuser -c "celery worker -E -A composeexample.celeryconf -n default@%h  --loglevel=INFO"

我可以毫无问题地调用 task.get()

关于django - celery 任务 .get() 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49572373/

有关django - celery 任务 .get() 不工作的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  2. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  3. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  4. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  5. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  6. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  7. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  8. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  9. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

    使用Ruby1.9.2运行IDE提示说需要gemruby​​-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall

  10. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

随机推荐