我有几个线程在执行多项任务。一个线程侦听来自 UDP 套接字的数据。另一个线程将数据处理成 JSON 对象并将数据排队。另一个线程发送信息。
我目前试图解决的是队列如何在空数据上工作?虽然大多数例程都做了一个
while not q.empty():
object = q.get()
当队列上有数据时,我需要找出如何在 while 循环中处理队列。
我想我可以放一会儿 True 循环并睡觉(1(。但问题是,如果数据进入队列的速度比睡眠时间快。如果我去掉 sleep(1(,那么我通常的理解是,while 循环只会吞噬 CPU。
所以我想我需要某种方法来告诉线程队列上有数据,因此运行处理例程?
您可以使用经典同步问题中使用的条件变量,以避免忙于等待。
您可以阅读有关"生产者消费者"问题的更多信息。
在这种情况下,生产者线程会将一个或多个项目添加到队列中,而使用者将是等待队列中项目的线程。
看看线程。使用情况的条件类和更多详细信息。
参考: https://docs.python.org/3/library/threading.html#threading.Condition
编辑:
如果您使用队列模块中的队列类,那么您不必通过队列实现线程锁定和条件管理的细节。
参考: https://docs.python.org/3.8/library/queue.html
def worker():
while True:
item = q.get()
if item is None:
break
do_work(item)
q.task_done()
q = queue.Queue()
threads = []
for i in range(num_worker_threads):
t = threading.Thread(target=worker)
t.start()
threads.append(t)
for item in source():
q.put(item)
# block until all tasks are done
q.join()
# stop workers
for i in range(num_worker_threads):
q.put(None)
for t in threads:
t.join()
在上面的示例中,工作线程正在等待队列中的项目。如果某个项目可用,则 Queue 对象将通知等待线程,其中一个线程将从队列中获取该项目。