我有一種感覺,這其實它不應該那麼困難,但到目前爲止,我還沒有什麼成功。運行鼠兔ioloop背景或使用自定義ioloop
說我有一個名爲PikaClass類包裝pika並提供了一些商業方法。
def PikaClass(object):
def __init__(self):
# connect to the broker
self.connection = pika.SelectConnection(<connection parameters>, self.on_connect)
# ..other init stuff..
def on_connect(self, connection):
# called when the connection has been established
# ..open a channel, declare some queues, etc.
def start(self):
# start the polling loop
self.connection.ioloop.start()
def foo(self, **kwargs):
# do some business logic, e.g., send messages to particular queues
直觀地看,這是我想達到的目標:用戶創建的PikaClass
實例,設置循環在後臺去,然後通過調用某些業務方法
p = PikaClass()
p.start()
bar = p.foo(..)
與對象進行交互
的問題是,p.start()塊,並防止主代碼從與對象交互一次啓動()被調用。我首先想到的是包裹在一個線程中調用:
Thread(target=p.start()).start()
bar = p.foo(..)
但仍然塊,你永遠不會p.foo(..)。文檔中提到你不應該在線程之間共享連接,以便在某個地方引起問題。
我也嘗試使用AsyncoreConnection而不是SelectConnection,並直接調用_connect()(而不是使用ioloop),但沒有任何影響(沒有任何反應)。
那麼,怎樣才能我在後臺運行ioloop,或至少跑我自己ioloop?
注:這是Python的2.6 Win64上(XP)與最新的0.9.4鼠兔
謝謝,GIL似乎確實是罪魁禍首。但是,我想避免因爲其另一種協議/間接擔心的過程(以及您提到的問題)。另一個解決方法是簡單地在Jython下運行(沒有GIL),並且工作不需要修改我的代碼。所以可能會堅持下去。雖然......知道如何繞過pika的ioloop仍然很好...... – dgorissen 2011-03-11 17:57:53
只要你不太依附任何基於C語言的librabries,jython就會很好。實際上,多線程並不算太糟糕,因爲在jython中線程的使用會遇到同樣的問題,至少你必須明確地共享狀態,以避免一些競爭條件等。 – theheadofabroom 2011-03-12 21:11:40