Celery: Celery Worker 在第一个任务后因 TypeError 崩溃:“NoneType”对象不可调用

创建于 2016-11-24  ·  54评论  ·  资料来源: celery/celery

清单

  • [X] 我在问题中包含了celery -A proj report的输出。
    (如果你不能做到这一点,那么至少指定芹菜
    受影响的版本)。
software -> celery:4.0.0 (latentcall) kombu:4.0.0 py:3.4.3
            billiard:3.5.0.2 py-amqp:2.1.1
platform -> system:Linux arch:64bit, ELF imp:CPython
loader   -> celery.loaders.default.Loader
settings -> transport:amqp results:disabled
  • [X] 我已经验证了 Celery 的master分支存在问题。
    是的,我已经测试过了,它使用 master 的行为是一样的。

重现步骤

不完全确定,因为具有相同规格和要求的其他机器正在工作。

预期行为

应该消耗任务。

实际行为

接受任务,然后记录回溯,然后工作人员出于某种原因重新连接到代理。 这永远重复:

[2016-11-23 23:09:00,468: INFO/MainProcess] Connected to amqp://user:**@10.136.131.6:5672//
[2016-11-23 23:09:00,484: INFO/MainProcess] mingle: searching for neighbors
[2016-11-23 23:09:01,921: INFO/MainProcess] mingle: sync with 1 nodes
[2016-11-23 23:09:01,922: INFO/MainProcess] mingle: sync complete
[2016-11-23 23:09:01,970: INFO/MainProcess] Received task: tasks.calculate_user_running_total[ddd103af-d527-4564-83f8-96b747767a0c]
[2016-11-23 23:09:01,972: CRITICAL/MainProcess] Unrecoverable error: TypeError("'NoneType' object is not callable",)
Traceback (most recent call last):
  File "./venv/lib/python3.4/site-packages/celery/worker/worker.py", line 203, in start
    self.blueprint.start(self)
  File "./venv/lib/python3.4/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "./venv/lib/python3.4/site-packages/celery/bootsteps.py", line 370, in start
    return self.obj.start()
  File "./venv/lib/python3.4/site-packages/celery/worker/consumer/consumer.py", line 318, in start
    blueprint.start(self)
  File "./venv/lib/python3.4/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "./venv/lib/python3.4/site-packages/celery/worker/consumer/consumer.py", line 584, in start
    c.loop(*c.loop_args())
  File "./venv/lib/python3.4/site-packages/celery/worker/loops.py", line 47, in asynloop
    consumer.consume()
  File "./venv/lib/python3.4/site-packages/kombu/messaging.py", line 470, in consume
    self._basic_consume(T, no_ack=no_ack, nowait=False)
  File "./venv/lib/python3.4/site-packages/kombu/messaging.py", line 591, in _basic_consume
    no_ack=no_ack, nowait=nowait)
  File "./venv/lib/python3.4/site-packages/kombu/entity.py", line 737, in consume
    arguments=self.consumer_arguments)
  File "./venv/lib/python3.4/site-packages/amqp/channel.py", line 1578, in basic_consume
    wait=None if nowait else spec.Basic.ConsumeOk,
  File "./venv/lib/python3.4/site-packages/amqp/abstract_channel.py", line 73, in send_method
    return self.wait(wait, returns_tuple=returns_tuple)
  File "./venv/lib/python3.4/site-packages/amqp/abstract_channel.py", line 93, in wait
    self.connection.drain_events(timeout=timeout)
  File "./venv/lib/python3.4/site-packages/amqp/connection.py", line 464, in drain_events
    return self.blocking_read(timeout)
  File "./venv/lib/python3.4/site-packages/amqp/connection.py", line 469, in blocking_read
    return self.on_inbound_frame(frame)
  File "./venv/lib/python3.4/site-packages/amqp/method_framing.py", line 88, in on_frame
    callback(channel, msg.frame_method, msg.frame_args, msg)
  File "./venv/lib/python3.4/site-packages/amqp/connection.py", line 473, in on_inbound_method
    method_sig, payload, content,
  File "./venv/lib/python3.4/site-packages/amqp/abstract_channel.py", line 142, in dispatch_method
    listener(*args)
  File "./venv/lib/python3.4/site-packages/amqp/channel.py", line 1613, in _on_basic_deliver
    fun(msg)
  File "./venv/lib/python3.4/site-packages/kombu/messaging.py", line 617, in _receive_callback
    return on_m(message) if on_m else self.receive(decoded, message)
  File "./venv/lib/python3.4/site-packages/celery/worker/consumer/consumer.py", line 558, in on_task_received
    callbacks,
  File "./venv/lib/python3.4/site-packages/celery/worker/strategy.py", line 145, in task_message_handler
    handle(req)
  File "./venv/lib/python3.4/site-packages/celery/worker/worker.py", line 221, in _process_task_sem
    return self._quick_acquire(self._process_task, req)
  File "./venv/lib/python3.4/site-packages/kombu/async/semaphore.py", line 62, in acquire
    callback(*partial_args, **partial_kwargs)
  File "./venv/lib/python3.4/site-packages/celery/worker/worker.py", line 226, in _process_task
    req.execute_using_pool(self.pool)
  File "./venv/lib/python3.4/site-packages/celery/worker/request.py", line 532, in execute_using_pool
    correlation_id=task_id,
  File "./venv/lib/python3.4/site-packages/celery/concurrency/base.py", line 155, in apply_async
    **options)
  File "./venv/lib/python3.4/site-packages/billiard/pool.py", line 1487, in apply_async
    self._quick_put((TASK, (result._job, None, func, args, kwds)))
TypeError: 'NoneType' object is not callable

上面的行每隔几秒钟就会重复一次,队列中没有任务被消耗。

最有用的评论

👍为此。 遇到同样的问题,即使在 4.0.1

所有54条评论

该错误在日志中重复出现,因为 Celery 工作守护程序正在崩溃,因此 systemd 重新启动它。

@askself._quick_put不知何故未定义。 台球应该在调用之前检查None值,捕获异常,还是应该self._quick_put永远不会是None

当我将billiard/pool.py#L1483 更改if self.threads or self._quick_put is None:时,芹菜不再崩溃,但由于某种原因,工作人员从未处理任何任务。

日志级别 DEBUG 的更详细输出:

[2016-11-27 14:48:09,875: DEBUG/MainProcess] | Worker: Preparing bootsteps.
[2016-11-27 14:48:09,877: DEBUG/MainProcess] | Worker: Building graph...
[2016-11-27 14:48:09,878: DEBUG/MainProcess] | Worker: New boot order: {Timer, Hub, Pool, Autoscaler, StateDB, Beat, Consumer}
[2016-11-27 14:48:09,889: DEBUG/MainProcess] | Consumer: Preparing bootsteps.
[2016-11-27 14:48:09,889: DEBUG/MainProcess] | Consumer: Building graph...
[2016-11-27 14:48:09,898: DEBUG/MainProcess] | Consumer: New boot order: {Connection, Agent, Events, Mingle, Tasks, Control, Gossip, Heart, event loop}
[2016-11-27 14:48:09,908: DEBUG/MainProcess] | Worker: Starting Hub
[2016-11-27 14:48:09,908: DEBUG/MainProcess] ^-- substep ok
[2016-11-27 14:48:09,908: DEBUG/MainProcess] | Worker: Starting Pool
[2016-11-27 14:48:09,998: DEBUG/MainProcess] ^-- substep ok
[2016-11-27 14:48:09,999: DEBUG/MainProcess] | Worker: Starting Consumer
[2016-11-27 14:48:10,000: DEBUG/MainProcess] | Consumer: Starting Connection
[2016-11-27 14:48:10,016: DEBUG/MainProcess] Start from server, version: 0.9, properties: {'cluster_name': 'rabbit<strong i="6">@rabbitmq</strong>', 'product': 'RabbitMQ', 'version': '3.5.6', 'information': 'Licensed under the MPL.
  See http://www.rabbitmq.com/', 'capabilities': {'authentication_failure_close': True, 'consumer_priorities': True, 'consumer_cancel_notify': True, 'per_consumer_qos': True, 'basic.nack': True, 'publisher_confirms': True, 'connection.blocked': True, 'exchange_exchange_bindings': True}, 'copyright': 'Copyright (C) 2007-2015 Pivotal Software, Inc.', 'platform': 'Erlang/OTP'}, mechanisms: ['AMQPLAIN', 'PLAIN'], locales: ['en_US']
[2016-11-27 14:48:10,018: INFO/MainProcess] Connected to amqp://user:**@10.136.131.6:5672//
[2016-11-27 14:48:10,018: DEBUG/MainProcess] ^-- substep ok
[2016-11-27 14:48:10,019: DEBUG/MainProcess] | Consumer: Starting Events
[2016-11-27 14:48:10,031: DEBUG/MainProcess] Start from server, version: 0.9, properties: {'cluster_name': 'rabbit<strong i="7">@rabbitmq</strong>', 'product': 'RabbitMQ', 'version': '3.5.6', 'information': 'Licensed under the MPL.  See http://www.rabbitmq.com/', 'capabilities': {'authentication_failure_close': True, 'consumer_priorities': True, 'consumer_cancel_notify': True, 'per_consumer_qos': True, 'basic.nack': True, 'publisher_confirms': True, 'connection.blocked': True, 'exchange_exchange_bindings': True}, 'copyright': 'Copyright (C) 2007-2015 Pivotal Software, Inc.', 'platform': 'Erlang/OTP'}, mechanisms: ['AMQPLAIN', 'PLAIN'], locales: ['en_US']
[2016-11-27 14:48:10,034: DEBUG/MainProcess] ^-- substep ok
[2016-11-27 14:48:10,034: DEBUG/MainProcess] | Consumer: Starting Mingle
[2016-11-27 14:48:10,035: INFO/MainProcess] mingle: searching for neighbors
[2016-11-27 14:48:10,036: DEBUG/MainProcess] using channel_id: 1
[2016-11-27 14:48:10,041: DEBUG/MainProcess] Channel open
[2016-11-27 14:48:10,061: DEBUG/MainProcess] Start from server, version: 0.9, properties: {'cluster_name': 'rabbit<strong i="8">@rabbitmq</strong>', 'product': 'RabbitMQ', 'version': '3.5.6', 'information': 'Licensed under the MPL.  See http://www.rabbitmq.com/', 'capabilities': {'authentication_failure_close': True, 'consumer_priorities': True, 'consumer_cancel_notify': True, 'per_consumer_qos': True, 'basic.nack': True, 'publisher_confirms': True, 'connection.blocked': True, 'exchange_exchange_bindings': True}, 'copyright': 'Copyright (C) 2007-2015 Pivotal Software, Inc.', 'platform': 'Erlang/OTP'}, mechanisms: ['AMQPLAIN', 'PLAIN'], locales: ['en_US']
[2016-11-27 14:48:10,063: DEBUG/MainProcess] using channel_id: 1
[2016-11-27 14:48:10,064: DEBUG/MainProcess] Channel open
[2016-11-27 14:48:11,189: INFO/MainProcess] mingle: sync with 3 nodes
[2016-11-27 14:48:11,190: DEBUG/MainProcess] mingle: processing reply from celery<strong i="9">@worker03</strong>
[2016-11-27 14:48:11,190: DEBUG/MainProcess] mingle: processing reply from celery<strong i="10">@worker02</strong>
[2016-11-27 14:48:11,190: DEBUG/MainProcess] mingle: processing reply from celery<strong i="11">@worker01</strong>
[2016-11-27 14:48:11,190: INFO/MainProcess] mingle: sync complete
[2016-11-27 14:48:11,191: DEBUG/MainProcess] ^-- substep ok
[2016-11-27 14:48:11,191: DEBUG/MainProcess] | Consumer: Starting Tasks
[2016-11-27 14:48:11,244: DEBUG/MainProcess] ^-- substep ok
[2016-11-27 14:48:11,244: DEBUG/MainProcess] | Consumer: Starting Control
[2016-11-27 14:48:11,244: DEBUG/MainProcess] using channel_id: 2
[2016-11-27 14:48:11,246: DEBUG/MainProcess] Channel open
[2016-11-27 14:48:11,251: DEBUG/MainProcess] ^-- substep ok
[2016-11-27 14:48:11,251: DEBUG/MainProcess] | Consumer: Starting Gossip
[2016-11-27 14:48:11,252: DEBUG/MainProcess] using channel_id: 3
[2016-11-27 14:48:11,253: DEBUG/MainProcess] Channel open
[2016-11-27 14:48:11,257: DEBUG/MainProcess] ^-- substep ok
[2016-11-27 14:48:11,258: DEBUG/MainProcess] | Consumer: Starting Heart
[2016-11-27 14:48:11,259: DEBUG/MainProcess] using channel_id: 1
[2016-11-27 14:48:11,260: DEBUG/MainProcess] Channel open
[2016-11-27 14:48:11,261: DEBUG/MainProcess] ^-- substep ok
[2016-11-27 14:48:11,261: DEBUG/MainProcess] | Consumer: Starting event loop
[2016-11-27 14:48:11,264: INFO/MainProcess] Received task: wakatime.tasks.cache_coding_activity[0eba267c-72e4-40ea-91dd-a1a7ab17c514]
[2016-11-27 14:48:11,265: DEBUG/MainProcess] TaskPool: Apply <function _fast_trace_task at 0x7ff469300950> (args:('wakatime.tasks.cache_coding_activity', '0eba267c-72e4-40ea-91dd-a1a7ab17c514', {'argsrepr': '()', 'task': 'wakatime.tasks.cache_coding_activity', 'lang': 'py', 'parent_id': '81f0c7ce-1396-496f-bf64-ae243736c845', 'timelimit': [None, None], 'root_id': '128647cc-f558-4b7d-bafc-338d186b5cfa', 'reply_to': 'e3c2b067-a058-3aa0-a3a1-384d4b917bbf', 'retries': 0, 'expires': None, 'delivery_info': {'exchange': '', 'priority': None, 'routing_key': 'cache', 'redelivered': True}, 'id': '0eba267c-72e4-40ea-91dd-a1a7ab17c514', 'correlation_id': '0eba267c-72e4-40ea-91dd-a1a7ab17c514', 'group': None, 'eta': None, 'kwargsrepr': "{'cache_projects': True, 'timeout': 15, 'user_id': UUID('d9c69ce0-f194-45a6-83cf-98f931fca8aa'), 'writes_only': False}", 'origin': 'gen3021<strong i="12">@worker02</strong>'}, '[[], {"cache_projects": true, "timeout": 15, "user_id": "d9c69ce0-f194-45a6-83cf-98f931fca8aa", "writes_only": false}, {"callbacks": null, "chain": null, "chord": null, "errbacks": null}]', 'application/json', 'utf-8') kwargs:{})
[2016-11-27 14:48:11,266: CRITICAL/MainProcess] Unrecoverable error: TypeError("'NoneType' object is not callable",)
Traceback (most recent call last):
  File "./venv/src/celery/celery/worker/worker.py", line 203, in start
    self.blueprint.start(self)
  File "./venv/src/celery/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "./venv/src/celery/celery/bootsteps.py", line 370, in start
    return self.obj.start()
  File "./venv/src/celery/celery/worker/consumer/consumer.py", line 318, in start
    blueprint.start(self)
  File "./venv/src/celery/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "./venv/src/celery/celery/worker/consumer/consumer.py", line 593, in start
    c.loop(*c.loop_args())
  File "./venv/src/celery/celery/worker/loops.py", line 47, in asynloop
    consumer.consume()
  File "./venv/lib/python3.4/site-packages/kombu/messaging.py", line 470, in consume
    self._basic_consume(T, no_ack=no_ack, nowait=False)
  File "./venv/lib/python3.4/site-packages/kombu/messaging.py", line 591, in _basic_consume
    no_ack=no_ack, nowait=nowait)
  File "./venv/lib/python3.4/site-packages/kombu/entity.py", line 737, in consume
    arguments=self.consumer_arguments)
  File "./venv/lib/python3.4/site-packages/amqp/channel.py", line 1578, in basic_consume
    wait=None if nowait else spec.Basic.ConsumeOk,
  File "./venv/lib/python3.4/site-packages/amqp/abstract_channel.py", line 73, in send_method
    return self.wait(wait, returns_tuple=returns_tuple)
  File "./venv/lib/python3.4/site-packages/amqp/abstract_channel.py", line 93, in wait
    self.connection.drain_events(timeout=timeout)
  File "./venv/lib/python3.4/site-packages/amqp/connection.py", line 464, in drain_events
    return self.blocking_read(timeout)
  File "./venv/lib/python3.4/site-packages/amqp/connection.py", line 469, in blocking_read
    return self.on_inbound_frame(frame)
  File "./venv/lib/python3.4/site-packages/amqp/method_framing.py", line 88, in on_frame
    callback(channel, msg.frame_method, msg.frame_args, msg)
  File "./venv/lib/python3.4/site-packages/amqp/connection.py", line 473, in on_inbound_method
    method_sig, payload, content,
  File "./venv/lib/python3.4/site-packages/amqp/abstract_channel.py", line 142, in dispatch_method
    listener(*args)
  File "./venv/lib/python3.4/site-packages/amqp/channel.py", line 1613, in _on_basic_deliver
    fun(msg)
  File "./venv/lib/python3.4/site-packages/kombu/messaging.py", line 617, in _receive_callback
    return on_m(message) if on_m else self.receive(decoded, message)
  File "./venv/src/celery/celery/worker/consumer/consumer.py", line 567, in on_task_received
    callbacks,
  File "./venv/src/celery/celery/worker/strategy.py", line 145, in task_message_handler
    handle(req)
  File "./venv/src/celery/celery/worker/worker.py", line 221, in _process_task_sem
    return self._quick_acquire(self._process_task, req)
  File "./venv/lib/python3.4/site-packages/kombu/async/semaphore.py", line 62, in acquire
    callback(*partial_args, **partial_kwargs)
  File "./venv/src/celery/celery/worker/worker.py", line 226, in _process_task
    req.execute_using_pool(self.pool)
  File "./venv/src/celery/celery/worker/request.py", line 532, in execute_using_pool
    correlation_id=task_id,
  File "./venv/src/celery/celery/concurrency/base.py", line 155, in apply_async
    **options)
  File "./venv/lib/python3.4/site-packages/billiard/pool.py", line 1487, in apply_async
    self._quick_put((TASK, (result._job, None, func, args, kwds)))
TypeError: 'NoneType' object is not callable
[2016-11-27 14:48:11,273: DEBUG/MainProcess] | Worker: Closing Hub...
[2016-11-27 14:48:11,274: DEBUG/MainProcess] | Worker: Closing Pool...
[2016-11-27 14:48:11,274: DEBUG/MainProcess] | Worker: Closing Consumer...
[2016-11-27 14:48:11,274: DEBUG/MainProcess] | Worker: Stopping Consumer...
[2016-11-27 14:48:11,274: DEBUG/MainProcess] | Consumer: Closing Connection...
[2016-11-27 14:48:11,275: DEBUG/MainProcess] | Consumer: Closing Events...
[2016-11-27 14:48:11,275: DEBUG/MainProcess] | Consumer: Closing Mingle...
[2016-11-27 14:48:11,275: DEBUG/MainProcess] | Consumer: Closing Tasks...
[2016-11-27 14:48:11,275: DEBUG/MainProcess] | Consumer: Closing Control...
[2016-11-27 14:48:11,275: DEBUG/MainProcess] | Consumer: Closing Gossip...
[2016-11-27 14:48:11,276: DEBUG/MainProcess] | Consumer: Closing Heart...
[2016-11-27 14:48:11,276: DEBUG/MainProcess] | Consumer: Closing event loop...
[2016-11-27 14:48:11,276: DEBUG/MainProcess] | Consumer: Stopping event loop...
[2016-11-27 14:48:11,276: DEBUG/MainProcess] | Consumer: Stopping Heart...
[2016-11-27 14:48:11,277: DEBUG/MainProcess] | Consumer: Stopping Gossip...
[2016-11-27 14:48:11,278: INFO/MainProcess] Received task: wakatime.tasks.cache_coding_activity[f786fc75-0518-4893-8988-ff7f063edd12]
[2016-11-27 14:48:11,278: DEBUG/MainProcess] TaskPool: Apply <function _fast_trace_task at 0x7ff469300950> (args:('wakatime.tasks.cache_coding_activity', 'f786fc75-0518-4893-8988-ff7f063edd12', {'argsrepr': '()', 'task': 'wakatime.tasks.cache_coding_activity', 'lang': 'py', 'parent_id': '81f0c7ce-1396-496f-bf64-ae243736c845', 'timelimit': [None, None], 'root_id': '128647cc-f558-4b7d-bafc-338d186b5cfa', 'reply_to': 'e3c2b067-a058-3aa0-a3a1-384d4b917bbf', 'retries': 0, 'expires': None, 'delivery_info': {'exchange': '', 'priority': None, 'routing_key': 'cache', 'redelivered': True}, 'id': 'f786fc75-0518-4893-8988-ff7f063edd12', 'correlation_id': 'f786fc75-0518-4893-8988-ff7f063edd12', 'group': None, 'eta': None, 'kwargsrepr': "{'cache_projects': True, 'timeout': 15, 'user_id': UUID('7056644f-2564-4074-b89e-631973879f44'), 'writes_only': False}", 'origin': 'gen3021<strong i="13">@worker02</strong>'}, '[[], {"cache_projects": true, "timeout": 15, "user_id": "7056644f-2564-4074-b89e-631973879f44", "writes_only": false}, {"callbacks": null, "chain": null, "chord": null, "errbacks": null}]', 'application/json', 'utf-8') kwargs:{})
[2016-11-27 14:48:11,279: INFO/MainProcess] Received task: wakatime.tasks.cache_coding_activity[d5c8dc57-116c-467d-9924-e2999280c2f8]
[2016-11-27 14:48:11,280: INFO/MainProcess] Received task: wakatime.tasks.cache_coding_activity[460ef864-e482-4b0f-8580-d0095750bae6]
[2016-11-27 14:48:11,281: DEBUG/MainProcess] Closed channel #3
[2016-11-27 14:48:11,281: DEBUG/MainProcess] | Consumer: Stopping Control...
[2016-11-27 14:48:11,283: DEBUG/MainProcess] Closed channel #2
[2016-11-27 14:48:11,283: DEBUG/MainProcess] | Consumer: Stopping Tasks...
[2016-11-27 14:48:11,284: DEBUG/MainProcess] Canceling task consumer...
[2016-11-27 14:48:11,286: DEBUG/MainProcess] | Consumer: Stopping Mingle...
[2016-11-27 14:48:11,286: DEBUG/MainProcess] | Consumer: Stopping Events...
[2016-11-27 14:48:11,286: DEBUG/MainProcess] | Consumer: Stopping Connection...
[2016-11-27 14:48:11,286: DEBUG/MainProcess] | Worker: Stopping Pool...
[2016-11-27 14:48:12,800: DEBUG/MainProcess] result handler: all workers terminated
[2016-11-27 14:48:12,801: DEBUG/MainProcess] | Worker: Stopping Hub...
[2016-11-27 14:48:12,801: DEBUG/MainProcess] | Consumer: Shutdown Heart...
[2016-11-27 14:48:12,802: DEBUG/MainProcess] | Consumer: Shutdown Gossip...
[2016-11-27 14:48:12,802: DEBUG/MainProcess] | Consumer: Shutdown Control...
[2016-11-27 14:48:12,802: DEBUG/MainProcess] | Consumer: Shutdown Tasks...
[2016-11-27 14:48:12,803: DEBUG/MainProcess] Canceling task consumer...
[2016-11-27 14:48:12,803: DEBUG/MainProcess] Closing consumer channel...
[2016-11-27 14:48:12,803: DEBUG/MainProcess] | Consumer: Shutdown Events...
[2016-11-27 14:48:12,804: DEBUG/MainProcess] Closed channel #1
[2016-11-27 14:48:12,805: DEBUG/MainProcess] | Consumer: Shutdown Connection...
[2016-11-27 14:48:12,806: DEBUG/MainProcess] Closed channel #1
[2016-11-27 14:48:12,807: DEBUG/MainProcess] removing tasks from inqueue until task handler finished

这是在 Celery 4.x 中引入的,因为降级到3.1.24会阻止回溯。

在 Linux Python 3.4 上不会发生在我身上。 你用什么论据来启动工人?

_quick_put 永远不应该是 None 顺便说一句。 这是在启动时发生还是总是在连接失败后发生?

我一直在尝试通过在执行任务时停止代理来进行复制,但在复制时仍然没有运气。

总是在启动时。 工人参数是:

/opt/app/venv/bin/python /opt/app/venv/bin/celery worker --app=wakatime.celery --workdir=/opt/app --logfile=/var/log/celery/worker.log --loglevel=INFO --concurrency=50 --exclude-queues=medium,low,cache

👍为此。 遇到同样的问题,即使在 4.0.1

@ask每当您在代理上有消息等待工作人员出现时处理时,我都会重现它。 使用beat时经常出现这种情况,这是我的情况。 如果 beat 服务在 worker 之前上线,由于上述问题,您将无法启动 worker。 我正在使用 python 2.7 来解决所有问题,并且能够始终如一地重现它。

这与 #3539 中提到的错误相同

@jmesquita这与我的场景一致,因为我的队列在启动工作人员时总是在代理上有待处理的消息。

@alanhamlett我正在尝试修复此问题并阅读代码,但我是 celery 新手,所以可能需要一些时间。 让我感到奇怪的是,有这么多人使用 celery 和 celery 消息默认排队给工人,这并没有在社区内爆发。 让我想知道我是否以某种方式滥用它。

我深入研究了代码, _quick_putAsyncPool._create_write_handlers分配,由AsyncPool.register_with_event_loop调用,由celery.worker.loops.asynloop调用。 从表面上看,问题似乎是asynloop首先调用consumer.consume()然后才调用obj.register_with_event_loop ,这导致_quick_putNone时它是从consume()内部调用的。

这可以解释为什么当事件循环启动时队列中没有消息时不会出现问题,因为consume()将什么都不做,下次调用它时, register_with_event_loop将已经被调用了。

我可以通过移动来解决这个问题

obj.controller.register_with_event_loop(hub)
obj.register_with_event_loop(hub)

consumer.consume()之前,尽管这当然只是一个非常幼稚(并且可能是错误的)修复。

因此,我通过使 celery beat 消息瞬变来解决我的问题,这实际上是我的预期行为。 一旦我对 Celery 及其代码库有了更多的经验,我就会重新审视这个问题。

@jmesquita

所以我通过使 celery beat 消息瞬变来解决我的问题

这可以防止错误发生。 感谢您的建议。

如果我试图从多个队列中消费,我只能重现这个错误。 如果所有内容都从单个队列中消耗,则启动按预期工作(队列上的消息被正确消耗)。

@adewes我测试了您提出的解决方案,至少从表面上看,它似乎解决了问题。

@adewes您能否发出拉取请求,以便我们讨论您提议的更改?

这个问题有更新吗? 现在这给我们带来了重大问题,包括生产中的问题。 我什至无法在本地进行测试,因为我遇到了TypeError问题。 我们可能不得不降级回 Celery 3。

我目前无法解决它,现在也降级到第 3 版,希望问题能尽快解决。 @thedrow我的“快速修复”没有完全解决问题,所以我没有打开拉取请求。 我并不完全精通所用组件的数据流(这里有几个库在起作用),所以很遗憾,我现在无法进一步调试它。

实际上,我什至不确定我们是否可以降级,因为我们可能依赖于 v2 任务设计中消息头的新用法。

@ask--我很高兴与您共享屏幕或其他任何内容,以便您可以查看我的确切环境以帮助调试,如果我们需要,甚至可以尝试打开远程调试。 我们有点束手无策,因为我们全神贯注于 Celery 4,但现在无法让我们的工人开始生产。

现在,您可以安装我的 fork 以在您的 prod 环境中运行:

pip install -e git://github.com/alanhamlett/celery.git@73147a9da31f2932eb4778e9474fbe72f23d21c2#egg=Celery

我刚刚打开#3752 来修复这个问题,但需要先找出一个好的测试来覆盖这个错误。

非常感谢。

开始认为我快疯了......我尝试升级到 4.0.2(目前在 4.0.0)并且随着升级,突然之间self.retry()也停止了工作。

在 CLI 中显式指定队列看起来像是四处走走(在 4.0.0 上)

我们确实在 CLI 中明确指定了队列; 我们仍然有这个问题。

2017 年 1 月 13 日星期五上午 5:35,Karol Duleba [email protected]
写道:

在 CLI 中显式指定队列看起来就像是四处走动(在
4.0.0)


您收到此消息是因为您发表了评论。
直接回复此邮件,在 GitHub 上查看
https://github.com/celery/celery/issues/3620#issuecomment-272412258或静音
线程
https://github.com/notifications/unsubscribe-auth/ABRHQSzvyRcQI5qvfufNwPJvXNElcQKPks5rR1NggaJpZM4K7LEz
.

@jdotjdot - 我看到了同样的事情。 在命令行上指定队列。
我只在队列中有数据时才看到问题。 如果队列为空,我可以启动工作人员,他们将运行。

+1

有这个确切的问题。 唯一的解决方案似乎是重置我的经纪人(这对队列不利)。

+1

在此之后,#3773,缺乏基本功能和过于复杂,我可能会用https://github.com/closeio/tasktiger 替换 Celery。 有人要接手#3752吗? 您所需要的只是编写一个测试来涵盖该问题。

@alanhamlett我不知道tasktiger,但它看起来很有希望。 你知道它有多成熟/稳定/可靠吗? 我通常是微框架的忠实粉丝,现在 Celery 已经发展壮大,有几个外部依赖项 + 切换到 Python3 ......事情似乎失控了(至少在我的部署中)。

考虑到 PR #3752 中已经有修复,发布这个的计划是什么? 请注意这是一个严重的错误,因为它会阻止任何生产环境使用 Celery 4.x。 你不能仅仅因为有待处理的消息进来就让工人死亡。

也希望看到这个合并

由于工人的短暂性对 Celery 如此重要,我无法想象还有太多其他问题比这个问题更值得优先考虑。 这是阻止我们进入 Prod 的唯一原因。 有没有人估计什么时候会解决?

@johnatron我也有同样的想法,但在 Prod 中遇到了多个其他新引入的错误。 不得不降级,这很困难,因为消息传递规范在 3.x 和 4.x 之间不兼容。 也让我看看 Celery 的替代品,比如tasktiger 。 小心使用 Prod 中的 Celery 4.xx。

消息规范与最新版本的 3.x 交叉兼容。

我承认我很惊讶这个问题没有得到解决。 我正在使用
Alan 的前叉现在正在生产中。

2017 年 2 月 13 日星期一下午 2:05,Alan Hamlett [email protected]
写道:

@johnatron https://github.com/johnatron我也有同样的想法,但是
在 Prod 中遇到了多个其他新引入的错误。 不得不降级,
这很困难,因为消息传递规范在 3.x 之间不兼容
和 4.x。 也让我看看 Celery 的替代品,比如 tasktiger
https://github.com/closeio/tasktiger 。 小心 Celery 4.xx 在
产品。


你收到这个是因为你被提到了。
直接回复此邮件,在 GitHub 上查看
https://github.com/celery/celery/issues/3620#issuecomment-279489134或静音
线程
https://github.com/notifications/unsubscribe-auth/ABRHQZkHixjDu37IA7PbAW6iJYcVTGevks5rcKligaJpZM4K7LEz
.

鉴于这个不幸的延迟,我决定将一些针对已知 Celery 4 问题的修复程序合并到git+http://github.com/Eugeny/celery#egg=celery==4.0.2.1
这包括:

  • @alanhamlett对这个问题的修复
  • @HealthTechDevelopersdjango-celery-beat计划未重新加载的修复

到目前为止在生产中运行良好

消息规范可能是交叉兼容的,但在 Celery Canvas 和链接(我们经常使用的功能)方面,版本之间存在(细微的)不兼容差异。 为了将我们的应用从 v3 移植到 v4,我们付出了相当大的努力。 不得不回去将是一个糟糕的时期。

哦,糟糕的一天! 谢谢你。

我在使用 Python 3.6 和 celery 4.0.2 时遇到了同样的问题。

关闭 celery,创建一个任务,启动 celery 并立即得到错误TypeError: 'NoneType' object is not callable@ask您能否考虑建议的修复和合并? 这阻止了以前快乐的 Celery 用户继续使用 Celery :(

谢谢你的时间,@ask!

“不再支持 Microsoft Windows。

测试套件正在通过,Celery 似乎可以与 Windows 一起使用,但我们不做任何保证,因为我们无法在这个平台上诊断问题。 如果您是需要此平台支持的公司,请与我们联系。”
可能不会修复。

@tiptoettt这不是 Windows 特有的问题。 我在 Mac 上。 能不能仔细看看大家的评论? 开发人员将因此放弃 Celery。 我已经使用芹菜 5 年了,这是一个大问题。 如果没有此问题,我将使用早期版本 3.1.25。

也有这个问题

lpiner<strong i="6">@host</strong>:~$ uname -a
Linux host 4.4.0-72-generic #93-Ubuntu SMP Fri Mar 31 14:07:41 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
lpiner<strong i="9">@host</strong>:~$ celery --version
4.0.2 (latentcall)

这是似乎导致问题的代码行:

task_queues = (
    Queue('queue1_name', Exchange('default'), routing_key='default'),
    Queue('queue2_name', Exchange('default'), routing_key='general.routing_key'),
)

删除第二个队列会导致问题消失。

根据我从@ChillarAnand在 celery/kombu/issues/675 中的帖子了解,这个问题应该由 4.0.3 解决,对吧?

自从我从 master 分支开始构建以来,我还没有看到这个问题。

2017 年 5 月 8 日下午 5:58,“Victor” [email protected]写道:

据我了解@ChillarAnand
https://github.com/ChillarAnand在 celery/kombu#675 中的帖子
https://github.com/celery/kombu/issues/675 ,这个问题应该解决了
到 4.0.3,对吧?


您收到此消息是因为您发表了评论。
直接回复此邮件,在 GitHub 上查看
https://github.com/celery/celery/issues/3620#issuecomment-300002736或静音
线程
https://github.com/notifications/unsubscribe-auth/AC3sA400hzoX7V0GUrUSfYmry9SZ8eIRks5r34_pgaJpZM4K7LEz
.

谢谢,它奏效了!

我在使用 RabbitMQ 的 Celery 3.1.23 (Cipter) 上遇到了同样的问题。 经过长时间的调试,我终于找到了这个线程并使用3.1.25版本解决了这个问题。 但它真的是把头撞在墙上。

具有多个队列 + 心跳的v4.0.2 (latentcall)上的相同问题。

v0.4.0.2解决方法上对我来说同样的问题是降级到v3.x

v4.0.2
对我来说,这个问题是一个引人注目的问题。 我不考虑降级到 3.x。 我希望新版本能尽快发布。

@ba1dr从主构建。 这为我解决了问题。

@LPiner ,谢谢,这为我解决了这个问题。 但这不是一个生产就绪的解决方案,是吗?

@ba1dr TBH 的选择不多。 要么是这个,要么降级回 3.x。
我们在生产中使用它没有问题,但我们的规模每天只有几百个工作,您的里程可能会有所不同。

我们很快就会发布。 见#4109

这里也受到影响。 就打我们吧。 准备发布!

此页面是否有帮助?
0 / 5 - 0 等级