gpt4 book ai didi

python - 如何从python中的线程池中唤醒线程?

转载 作者:太空宇宙 更新时间:2023-11-04 01:24:24 25 4
gpt4 key购买 nike

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

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

最佳答案

首先定义一个队列:

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 绑定(bind),但您应该能够轻松地弄清楚如何使代码片段适应您的实际应用程序代码;要注意的关键部分是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))

关于python - 如何从python中的线程池中唤醒线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19004695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com