我是Python新手,正在使用Python 2.7开发应用程序。我正在使用concurrent.futures
库提供的线程池。一旦来自ThreadPool
的线程启动,它就需要等待来自RabbitMQ的一些消息。
如何在Python中实现此逻辑以使来自池的此线程等待事件消息?基本上我需要从RabbitMQ收到消息后唤醒一个等待的线程(即在ThreadPool
上等待并通知实现)。
答案 0 :(得分:3)
首先定义Queue
:
from Queue import Queue
q = Queue()
然后,在你的线程中,你试图从该队列中获取一个项目:
msg = q.get()
这会阻塞整个线程,直到在队列中找到某些东西。
现在,同时,假设通过触发回调通知您的传入事件,您注册一个回调,只是将收到的RabbitMQ消息放入队列中:
def on_message(msg):
q.put(msg)
rabbitmq_channel.register_callback(on_message)
或者如果你喜欢更短的代码:
rabbitmq_channel.register_callback(lambda msg: q.put(msg))
(上面是伪代码,因为我没有使用RabbitMQ,也没有使用RabbitMQ的Python绑定,但你应该能够轻松地弄清楚如何使代码片段适应你真正的应用程序代码;要注意的关键部分是q.put(msg)
- 只要确保在收到新消息后立即调用该部分。)
一旦发生这种情况,线程就会被唤醒并可以自由处理该消息。为了对多个消息重用相同的线程,只需使用while
循环:
while True:
msg = q.get()
process_message(msg)
P.S。我建议看看Gevent以及如何在Python应用程序中将它与RabbitMQ结合起来,以便能够摆脱线程并使用更轻量级和可扩展的绿色线程机制,而无需管理线程池(因为你可以拥有成千上万的小动物在飞行中产生和死亡):
# this thing always called in a green thread; forget about pools and queues.
def on_message(msg):
# you're in a green thread now; just process away!
benefit_from("all the gevent goodness!")
spawn_and_join_10_sub_greenlets()
rabbitmq_channel.register_callback(lambda msg: gevent.spawn(on_message, msg))