避免ConnectionResetError:[Errno 104]由celery.app.control的同级重置连接

时间:2020-05-27 08:41:09

标签: python-3.x celery amqp

我正在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关闭。

要解决这个问题,我虽然有两个选择:

  1. 禁用连接池
  2. 在ConnectionResetError异常上添加重试

除了禁用连接池外,还有其他优雅的方法会影响性能吗?

0 个答案:

没有答案