[英]RabbitMQ/Pika blocking consumer with evenlet
我正在开发一个需要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()
Pika和eventlet.monkey_patch
不兼容。 如果可能的话,您将必须使用eventlet
而不修补系统调用。
注意: RabbitMQ团队监视rabbitmq-users
邮件列表 ,仅在某些情况下回答关于StackOverflow的问题。
通过猴子修补,我能够eventlet
让pika
消费者使用eventlet
,并以修补方式导入pika
。
首先导入并修补stdlib:
import eventlet
eventlet.monkey_patch()
然后导入并修补pika
本身:
pika = eventlet.import_patched('pika')
我将这种导入策略与异步eventlet
结合使用: https : eventlet
并使用了eventlet
原语而不是使用threading
来实现非阻塞消费者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.