0

假设我有一个线程池。这个线程池使用两个队列q1q2. 它读取q1并写入新项目q2。当q1为空时,我们交换两个队列q1, q2, = q2, q1并重复该过程,直到两个队列都为空。为了同步线程,我使用了另一个仅包含一个项目的队列,并在进程结束时删除了该项目。

我认为这是一种非常愚蠢的做法。有什么改进建议吗?

文档上有一个非常好的简单示例,但只有一个队列。我的解决方案看起来不太好,如果它是正确的:

global flag
global lock
global barrier
global q1
global q2
global q
while True:
    if q1.empty():
        flag = False
        barrier.wait() # wait for all the theads to reach this point.
        # execute the code of swapping queues only once
        with lock:
            if not flag:
                flag = True
                if q2.empty():
                    q.get()
                    q.task_done()
                else:
                    q1, q2 = q2, q1

    process_items_in_q1()
4

1 回答 1

0

我认为你的方法有效。以下是您可能会或可能不会找到更好的另外两个:

  1. 您可以只使用一个队列并推送 N 个标记来分隔“级别”,其中 N 是线程数。当一个线程读取一个标记时,它只调用barrier.wait()。如果目标只是确保所有 N 个线程在级别之间调用 barrier.wait(),这应该就足够了。

  2. 或者,您可以简化上面发布的代码:使用 2 个普通列表而不是 2 个队列。所有线程都从 中弹出list1并附加到list2,这在 Queue 的逻辑中不需要特别注意。此外,如果每个“级别”都相对较大,您可以简单地为每个级别重复创建线程并等待它们全部完成的整个代码。这将使一次一级的逻辑更加明显。

(最后,像往常一样,请注意,到目前为止,您没有通过在 Python 中使用线程获得任何处理能力:这是 GIL。)

于 2012-12-12T00:35:13.313 回答