6

我一直在尝试通过使用 Pika 库(由 gevent 修补的猴子)在我的 gevent 程序中使用 RabbitMQ,gevent 喜欢随机抛出超时错误。

我该怎么办?我可以使用另一个库吗?

WARNING:root:Document not found, retrying primary.
Traceback (most recent call last):
  ...
  File "/usr/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 32, in __init__
    BaseConnection.__init__(self, parameters, None, reconnection_strategy)
  File "/usr/lib/python2.7/dist-packages/pika/adapters/base_connection.py", line 50, in __init__
    reconnection_strategy)
  File "/usr/lib/python2.7/dist-packages/pika/connection.py", line 170, in __init__
    self._connect()
  File "/usr/lib/python2.7/dist-packages/pika/connection.py", line 228, in _connect
    self.parameters.port or  spec.PORT)
  File "/usr/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 44, in _adapter_connect
    self._handle_read()
  File "/usr/lib/python2.7/dist-packages/pika/adapters/base_connection.py", line 151, in _handle_read
    data = self.socket.recv(self._suggested_buffer_size)
  File "/usr/lib/python2.7/dist-packages/gevent/socket.py", line 427, in recv
    wait_read(sock.fileno(), timeout=self.timeout, event=self._read_event)
  File "/usr/lib/python2.7/dist-packages/gevent/socket.py", line 169, in wait_read
    switch_result = get_hub().switch()
  File "/usr/lib/python2.7/dist-packages/gevent/hub.py", line 164, in switch
    return greenlet.switch(self)
timeout: timed out
4

2 回答 2

5

Pika 并不适合与 gevent 一起使用,因为 pika 实现了自己的基于非阻塞套接字的到 RabbitMQ 的异步连接。这与 gevent 的实现不太匹配。

您可能需要考虑使用py-amqplibkombu

于 2012-07-06T05:01:36.993 回答
0

在 Django/Gunicorn 应用程序中使用 Pika 时,我也遇到了超时问题。我玩过提高connection_attempts或增加超时,但 RabbitMQ 总是以握手错误关闭连接。后者似乎表明 Pika 从未在套接字上传输任何数据。

超时的原因可能是这个libevent 错误- 至少在我的环境中,附加到错误的脚本能够重现该问题。

您可以尝试升级到 gevent>=1.0(在撰写本文时尚未发布):

wget http://gevent.googlecode.com/files/gevent-1.0b4.tar.gz
pip install gevent-1.0b4.tar.gz
于 2012-10-01T23:18:40.360 回答