唤醒睡眠线程的最佳方法是什么?

20 投票
1 回答
15829 浏览
提问于 2025-04-18 01:15

我在局域网里有一个设备,每隔5到10毫秒就会发送一个UDP数据包。在我的应用程序中,有一个读取线程,它在启动时分配了一个大缓冲区的套接字,然后进入一个无限循环,读取累积的数据包,解析这些数据包,把它们写入一个缓冲区,然后睡眠半秒钟(time.sleep(0.500))。

我有几个懒惰的数据消费者,大部分是用来归档或者生成一些被动的统计数据。但有一个消费者(用于显示)需要实时数据,它需要在查询缓冲区之前唤醒正在睡觉的读取线程(让它去读取套接字)。

唤醒一个正在睡觉的线程的最佳方法是什么?

(或者,是否有更好的方式让线程睡觉,这样更容易被唤醒?)

1 个回答

29

我之前没注意到,threading.condition.wait() 这个方法其实有一个可选的超时参数!

解决办法是 创建一个条件对象,然后用它的 wait() 方法,记得加上可选的超时参数,这样就不用用 time.sleep() 了。如果线程需要在超时之前被唤醒,可以调用条件对象的 notify() 方法。

撰写回答