У меня такое ощущение, что на самом деле это не должно быть таким уж сложным, но пока у меня небольшой успех.
Скажем, у меня есть класс под названием 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 () блокирует и предотвращает взаимодействие основного кода с объектом после вызова start ().Моей первой мыслью было заключить вызов в поток:
Thread(target=p.start()).start()
bar = p.foo(..)
Но это все еще блокирует, и вы никогда не получите p.foo (..).В документах упоминается, что вам не следует делить соединение между потоками, чтобы это могло где-то вызвать проблему.
Я также пытался использовать AsyncoreConnection вместо SelectConnection и вызывать _connect () напрямую (вместо использования ioloop)но это не имеет никакого эффекта (ничего не происходит).
Так как я могу запустить ioloop в фоновом режиме или, по крайней мере, запустить свой собственный ioloop?
Примечание: это Python 2.6 onwin64 (xp) с последней пикой 0.9.4