【问题标题】:rabbitmq using threads with pikarabbitmq 使用带有 pika 的线程
【发布时间】:2016-03-13 22:13:55
【问题描述】:

我正在尝试使用 rabbitmq 获得一个基本的队列系统,但是当我尝试使用线程时,它似乎只运行 1 个线程。

我的代码:

import pika
import threading

rabbit_url = "amqp://user:pass!@127.0.0.1:5672/%2f"

def start(max_threads):
    for i in xrange(max_threads):
        t = threading.Thread(target=run)
        t.start()
        t.join()

def run():
    connection = pika.BlockingConnection(pika.URLParameters(rabbit_url))
    channel = connection.channel()
    channel.basic_consume(callback,
                          queue='docketq',
                          no_ack=True)

    channel.start_consuming()

def callback(ch, method, properties, body):
    do_work(body)

def do_work(body):
    print body

【问题讨论】:

    标签: python multithreading rabbitmq pika


    【解决方案1】:

    t.join() 等待线程完成。在start() 循环的第一次迭代中,您启动第一个线程,然后等待它完成,但它永远不会完成,因为channel.start_consuming() 是一个等待传入消息的无限循环。

    【讨论】:

    • 一般情况下,将 t.start() 和 t.join() 放在同一个循环中,也会出现类似的错误。
    • 如何停止channel.start_consuming()
    【解决方案2】:

    Pika 不是线程安全的。来自Pika FAQ

    Pika 线程安全吗?

    Pika 在代码中没有任何线程概念。如果您想将 Pika 与线程一起使用,请确保每个线程都有一个在该线程中创建的 Pika 连接。跨线程共享一个 Pika 连接是不安全的。

    【讨论】:

    • 但是没有共享连接,因为连接是在run中创建的,每个线程执行一次。
    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多