2016-03-13 51 views
1

我想用rabbitmq獲得一個基本的隊列系統,但是當我嘗試使用線程時,它似乎只運行1個線程。rabbitmq與pika使用線程

我的代碼:

import pika 
import threading 

rabbit_url = "amqp://user:[email protected]: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 

回答

0

鼠兔不是線程安全的。來自Pika FAQ

Pika線程安全嗎?

Pika沒有任何線程代碼的概念。如果你想在線程中使用Pika,確保你在該線程中創建了每個線程的Pika連接。在線程間共享一個Pika連接是不安全的。

+0

你是從某處複製這些東西的嗎?請註明來源/放置您複製這些文本的鏈接,否則,可能會被視爲抄襲。謝謝。 – Pang

+0

但是沒有共享連接,因爲連接是在'run'中創建的,每個線程執行一次。 –

1

t.join()等待線程結束。在start()循環的第一次迭代中,您啓動第一個線程,然後等待它結束,但永遠不會因爲channel.start_consuming()是一個等待傳入消息的無限循環。