Я работаю над более крупным приложением, для которого требуется eventlet, а теперь также требуется RabbitMQ. Похоже, что eventlet заставляет потребительский поток pika блокировать выполнение дополнительных рабочих процессов. Я знаю, что Pika не считается потокобезопасным, поэтому у меня есть все, включая соединение, в своем собственном потоке. Я бы предположил, что блокирующее соединение должно блокировать только потребительский поток. Как я могу заставить pika и eventlet работать вместе? В приведенном ниже примере рабочий поток никогда ничего не выводит, но закомментирование eventlet.monkey_patch()
позволяет выполнять оба потока.
import threading
import pika
import eventlet
eventlet.monkey_patch()
def callback(ch, method, properties, body):
print body
ch.basic_ack(delivery_tag=method.delivery_tag)
def consumer():
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='test', durable=True,
exclusive=False, auto_delete=False)
channel.basic_consume(callback, queue='test')
channel.start_consuming()
def start_consumer_thread():
# initialize a listener thread
consumer_thread = threading.Thread(target=consumer)
consumer_thread.start()
def worker():
start_consumer_thread()
for x in range(1,10000):
print x
x = threading.Thread(target=worker())
x.start()