在python中如何从线程池中唤醒线程?

2024-04-28 07:48:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,正在用python2.7开发一个应用程序。我正在使用concurrent.futures库提供的线程池。启动ThreadPool中的线程后,它需要等待RabbitMQ的一些消息。在

如何在Python中实现这个逻辑,使池中的线程等待事件消息?基本上,我需要在收到RabbitMQ的消息后唤醒一个等待线程(即等待并通知ThreadPool上的实现)。在


Tags: 应用程序消息rabbitmq事件逻辑线程concurrentthreadpool
1条回答
网友
1楼 · 发布于 2024-04-28 07:48:35

首先定义Queue

from Queue import Queue

q = Queue()

然后,在线程中,尝试从该队列中获取项目:

^{pr2}$

这将阻塞整个线程,直到在队列中找到某些内容为止。在

现在,同时,假设您的传入事件通过触发回调得到通知,您将注册一个回调,该回调只将接收到的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)

另外,我建议您研究一下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))

相关问题 更多 >