Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python RabbitMQ/Pika使用evenlet阻塞用户_Python_Python 2.7_Rabbitmq_Pika_Eventlet - Fatal编程技术网

Python RabbitMQ/Pika使用evenlet阻塞用户

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,现在也需要rabbitMQ。eventlet似乎正在导致pika使用者线程阻止其他工作线程的执行。我知道Pika不被认为是线程安全的,所以我在它自己的线程中拥有一切,包括连接。我假设阻塞连接应该只阻塞使用者线程。我怎样才能让pika和eventlet一起工作?在下面的示例中,workers线程从不打印任何内容,但注释出
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库=]