2012-06-28 3 views
5

J'ai essayé d'utiliser RabbitMQ à partir de mon programme gevent en utilisant la bibliothèque Pika (singe patché par gevent), gevent aime aléatoirement une erreur de timeout.Erreur de timeout aléatoire avec Pika et gevent

Que dois-je faire? Y a-t-il une autre bibliothèque que je pourrais utiliser?

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 
+0

Je suis face à la même question lorsque j'utilise 2 ou plusieurs producteurs dans un fil vert seulement . –

Répondre

5

Pika est pas idéalement adapté à une utilisation avec gevent parce que pika implémente sa propre connexion asynchrone à RabbitMQ basé sur les sockets non-bloquant. Cela ne correspond tout simplement pas à la mise en œuvre de Gevent de la même chose.

Vous voudrez peut-être envisager d'utiliser py-amqplib ou kombu

0

Je vais avoir des problèmes de délai d'attente à l'utilisation Pika dans une application Django/gunicorn. J'ai joué avec l'élévation connection_attempts ou en augmentant le timeout mais RabbitMQ a toujours fermé la connexion avec une erreur de poignée de main. Ce dernier semble indiquer que Pika n'a jamais transmis de données sur le socket.

La cause des délais d'attente pourrait être cette libevent bug - au moins dans mon environnement le script attaché au bogue est capable de reproduire le problème.

Vous pouvez essayer de passer à gevent> = 1.0 (au moment de l'écriture non encore sorti):

wget http://gevent.googlecode.com/files/gevent-1.0b4.tar.gz 
pip install gevent-1.0b4.tar.gz 
+0

J'ai essayé d'utiliser '' '' 'gevent-1.0.1''' - pas de chance. –

Questions connexes