我正在python代码中使用celery.app.control
。该代码可确保在开始新任务之前,没有以前执行的芹菜任务(使用revoke命令)。
Python: 3.6.10
Celery: 4.1.0
RabbitMQ作为消息代理
有时会引发以下错误:
message: Failed revoking task *************************************, Exception: Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/celery/app/control.py", line 210, in revoke
}, **kwargs)
File "/usr/local/lib/python3.6/site-packages/celery/app/control.py", line 436, in broadcast
limit, callback, channel=channel,
File "/src/kombu/kombu/pidbox.py", line 315, in _broadcast
serializer=serializer)
File "/src/kombu/kombu/pidbox.py", line 290, in _publish
serializer=serializer,
File "/src/kombu/kombu/messaging.py", line 181, in publish
exchange_name, declare,
File "/src/kombu/kombu/messaging.py", line 203, in _publish
mandatory=mandatory, immediate=immediate,
File "/usr/local/lib/python3.6/site-packages/amqp/channel.py", line 1748, in _basic_publish
(0, exchange, routing_key, mandatory, immediate), msg
File "/usr/local/lib/python3.6/site-packages/amqp/abstract_channel.py", line 64, in send_method
conn.frame_writer(1, self.channel_id, sig, args, content)
File "/usr/local/lib/python3.6/site-packages/amqp/method_framing.py", line 178, in write_frame
write(view[:offset])
File "/usr/local/lib/python3.6/site-packages/amqp/transport.py", line 272, in write
self._write(s)
ConnectionResetError: [Errno 104] Connection reset by peer
经过代码检查,我发现引擎盖下使用了一个连接池。因此,任何心跳发送或连接都不会超过60秒。该连接被RabbitMQ关闭。
要解决这个问题,我虽然有两个选择:
除了禁用连接池外,还有其他优雅的方法会影响性能吗?