Python在多线程和连续处理中排队



我有几个线程在执行多项任务。一个线程侦听来自 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 对象将通知等待线程,其中一个线程将从队列中获取该项目。

最新更新