所有其他 celery 任务都失败;好像是“未注册”

问题描述 投票:0回答:1

我正在使用

celery
运行名为
'filter'
的任务。

我遇到了一个奇怪的错误,所有其他任务调用似乎都会导致

celery.exceptions.NotRegistered
异常。

通过每一个其他电话,我的意思是:

  • 我调用过一次,它有效
  • 我再次调用它,它失败了(错误如下)
  • 我第三次调用它,又起作用了。
  • 我第四次调用它,失败(同样的错误)消息

我像这样使用

send_task
来调用它,存储
task_id
以便稍后可以将其集中。

async_result1 = celery_app.send_task("filter", kwargs=data.dict())

output = {"task_id": async_result1.task_id}

然后我每隔几秒轮询一次应用程序以获取任务的状态,如下所示:

result=AsyncResult(task_id)

(if status is not success, keep polling until it's successful)

奇怪的是,代码可以运行一次,但当我再次调用时,它会失败。

我已经通过 ssh 进入工作容器,当我运行

celery result
传递失败的任务 Id 像这样
celery -A app.name result -t filter  880df2ee-0a25-455f-93fb-50af3d5980e5
时,这是我得到的输出(最后一行显示了我上面提到的错误)

Traceback (most recent call last):
  File "/usr/local/bin/celery", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.7/site-packages/celery/__main__.py", line 16, in main
    _main()
  File "/usr/local/lib/python3.7/site-packages/celery/bin/celery.py", line 322, in main
    cmd.execute_from_commandline(argv)
  File "/usr/local/lib/python3.7/site-packages/celery/bin/celery.py", line 495, in execute_from_commandline
    super(CeleryCommand, self).execute_from_commandline(argv)))
  File "/usr/local/lib/python3.7/site-packages/celery/bin/base.py", line 305, in execute_from_commandline
    return self.handle_argv(self.prog_name, argv[1:])
  File "/usr/local/lib/python3.7/site-packages/celery/bin/celery.py", line 487, in handle_argv
    return self.execute(command, argv)
  File "/usr/local/lib/python3.7/site-packages/celery/bin/celery.py", line 419, in execute
    ).run_from_argv(self.prog_name, argv[1:], command=argv[0])
  File "/usr/local/lib/python3.7/site-packages/celery/bin/base.py", line 309, in run_from_argv
    sys.argv if argv is None else argv, command)
  File "/usr/local/lib/python3.7/site-packages/celery/bin/base.py", line 393, in handle_argv
    return self(*args, **options)
  File "/usr/local/lib/python3.7/site-packages/celery/bin/base.py", line 253, in __call__
    ret = self.run(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/celery/bin/result.py", line 41, in run
    value = task_result.get()
  File "/usr/local/lib/python3.7/site-packages/celery/result.py", line 228, in get
    on_message=on_message,
  File "/usr/local/lib/python3.7/site-packages/celery/backends/asynchronous.py", line 195, in wait_for_pending
    return result.maybe_throw(callback=callback, propagate=propagate)
  File "/usr/local/lib/python3.7/site-packages/celery/result.py", line 333, in maybe_throw
    self.throw(value, self._to_remote_traceback(tb))
  File "/usr/local/lib/python3.7/site-packages/celery/result.py", line 326, in throw
    self.on_ready.throw(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/vine/promises.py", line 244, in throw
    reraise(type(exc), exc, tb)
  File "/usr/local/lib/python3.7/site-packages/vine/five.py", line 195, in reraise
    raise value
celery.exceptions.NotRegistered: 'filter'

知道这里会发生什么吗?我觉得我缺少一些东西,也许我需要以某种方式刷新/重新启动队列?

  • 我正在使用

    docker-compose
    ,这就是工作容器的启动方式:

    celery worker -A app.name -P threads --loglevel=DEBUG

  • 这里有一个好奇心:我开始将

    --queues
    参数传递给
    celery worker **no call whatsoever worked**. When I removed the 
    --queues` 参数,它开始表现得像现在一样。其他所有调用都失败。

  • 当我运行

    celery inspect
    查看工作线程状态时,我注意到只有最终成功的任务才会添加到队列中

    root@604dce1e1dda:/workers# celery -A app.name inspect active
    -> celery@76089a886b04: OK
      - empty -
    -> celery@604dce1e1dda: OK
      * {'id': '4d35d0bf-e3b4-4a6b-9a2e-4b23e12c98b1', 'name': 'filter', 'args': [], 'kwargs': {'foo': 'bar'}, 'type': 'filter', 'hostname': 'celery@604dce1e1dda', 'time_start': 1671406221.0351112, 'acknowledged': True, 'delivery_info': {'exchange': '', 'routing_key': 'celery', 'priority': 0, 'redelivered': False}, 'worker_pid': 1}
    
  • 任务已正确注册(但似乎只有以

    1dda
    结尾的任务)

    root@604dce1e1dda:/workers# celery -A app.name inspect registered
    -> celery@76089a886b04: OK
       * model
    -> celery@604dce1e1dda: OK
       * filter
    

PS。 :我正在

celery 4.4.0 (cliffs)
 上运行 
python 3.7.16

python queue celery
1个回答
0
投票

我也遇到了类似的错误。解决方案是使用自定义名称设置默认队列。默认情况下,它会创建一个名为 celery 的队列。问题是有另一个 celery 工作人员使用相同的 redis 服务。两个 celery 实例都在监听同一个队列

celery
。但另一个 celery 实例在不同的源代码上运行,因此出现 NotRegisteredTask 异常。

© www.soinside.com 2019 - 2024. All rights reserved.