Python RabbitMQ/Pika使用evenlet阻塞用户
我正在开发一个更大的应用程序,它需要eventlet,现在也需要rabbitMQ。eventlet似乎正在导致pika使用者线程阻止其他工作线程的执行。我知道Pika不被认为是线程安全的,所以我在它自己的线程中拥有一切,包括连接。我假设阻塞连接应该只阻塞使用者线程。我怎样才能让pika和eventlet一起工作?在下面的示例中,workers线程从不打印任何内容,但注释出Python RabbitMQ/Pika使用evenlet阻塞用户,python,python-2.7,rabbitmq,pika,eventlet,Python,Python 2.7,Rabbitmq,Pika,Eventlet,我正在开发一个更大的应用程序,它需要eventlet,现在也需要rabbitMQ。eventlet似乎正在导致pika使用者线程阻止其他工作线程的执行。我知道Pika不被认为是线程安全的,所以我在它自己的线程中拥有一切,包括连接。我假设阻塞连接应该只阻塞使用者线程。我怎样才能让pika和eventlet一起工作?在下面的示例中,workers线程从不打印任何内容,但注释出eventlet.monkey\u patch()允许两个线程都执行 import threading import pika
eventlet.monkey\u 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\u补丁
不兼容。如果可能的话,您必须在不修补系统调用的情况下使用eventlet
注意:RabbitMQ团队监视并有时只回答有关StackOverflow的问题。Pika和
eventlet.monkey_补丁
不兼容。如果可能的话,您必须在不修补系统调用的情况下使用eventlet
注意:RabbitMQ团队监控并有时只回答有关StackOverflow的问题。我能够让
pika
消费者尽早使用eventlet
,方法是通过猴子补丁,并以补丁方式导入pika
首先导入并修补stdlib:
import eventlet
eventlet.monkey_patch()
然后导入并修补pika自身:
pika = eventlet.import_patched('pika')
我将此导入策略与asynchronous_consumer_示例结合使用:并使用
eventlet
原语而不是线程
来实现非阻塞消费者。我能够通过猴子补丁尽早获得一个pika
消费者使用eventlet
,并以补丁方式导入pika
首先导入并修补stdlib:
import eventlet
eventlet.monkey_patch()
然后导入并修补pika自身:
pika = eventlet.import_patched('pika')
我将此导入策略与asynchronous_consumer_示例结合使用:并使用
eventlet
原语而不是threading
来实现非阻塞消费者。谢谢。有没有一种方法可以定期检查队列中的消息并使用它,而不是使用一个永无止境的阻塞循环?不确定这是不是真的。奥斯陆消息是用皮卡,这是猴子打补丁。在导入其他库之前,应该始终使用monkey修补程序。尝试在pika导入之前移动monkey_补丁。@eandersson-看起来不再是这样了。这是一个遗憾,因为Pika比kombu或RabbitMQ的其他python库可靠得多。是的,当他们引入Pika支持时,他们不允许Pika和kombu驱动程序混合使用,这是一个错误。因此,如果您想使用pika,您必须关闭整个云以更新配置。顺便说一句,以确保可靠性!我更喜欢我的amqp库=]谢谢。有没有一种方法可以定期检查队列中的消息并使用它,而不是使用一个永无止境的阻塞循环?不确定这是不是真的。奥斯陆消息是用皮卡,这是猴子打补丁。在导入其他库之前,应该始终使用monkey修补程序。尝试在pika导入之前移动monkey_补丁。@eandersson-看起来不再是这样了。这是一个遗憾,因为Pika比kombu或RabbitMQ的其他python库可靠得多。是的,当他们引入Pika支持时,他们不允许Pika和kombu驱动程序混合使用,这是一个错误。因此,如果您想使用pika,您必须关闭整个云以更新配置。顺便说一句,以确保可靠性!我更喜欢我的amqp库=]