繁体   English   中英

RabbitMQ / Pika阻止用户使用偶数

[英]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的问题。

通过猴子修补,我能够eventletpika消费者使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM