Python:等待所有线程在代码中的特定点继续

时间:2019-05-28 11:53:25

标签: python multithreading async-await

我想在多个线程上运行一个进程,但是在每次迭代之后,进程应该等待全局进程完成。更具体地说:

我有一个“蚂蚁”列表,所有这些蚂蚁都在图上构建游览(我想同时进行)。这在许多迭代中发生了很多次。每个蚂蚁完成迭代之后,我想更新该图。我怎样才能最好地做到这一点?我有一些代码:

ants = [Ant() for _ in range(50)] # 50 ants in a list

with concurrent.futures.ThreadPoolExecutor(max_workers=4) as ex:
    # start threads on slices of ants
    f1 = ex.submit(solve_aco, ants[:n_ants//4], epochs)
    f2 = ex.submit(solve_aco, ants[n_ants//4:n_ants // 2], epochs)
    f3 = ex.submit(solve_aco, ants[n_ants // 2:n_ants // 2 + n_ants // 4], epochs)
    f4 = ex.submit(solve_aco, ants[n_ants // 2 + n_ants // 4:], epochs)

    # while not finished: if all ants are waiting, update graph

def solve_aco(ants, epochs):
    for _ in range(epochs):
        # Construct route through graph
        # Wait until graph update, then continue next epoch

我已经尝试过使用threading.Condition()进行一些操作,但是我似乎无法弄清楚在哪里以及如何正确等待/通知线程。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

使用concurrent.futures.wait()https://docs.python.org/3/library/concurrent.futures.html#module-functions),您可以等待工作线程中的工作完成后再继续。

BTW:由于全局解释器锁定,如果您在solve_aco中所做的工作全部发生在纯Python代码中,那么多线程将不会提高性能。您可以使用ProcessPoolExecutor来代替,尽管它会带来更多开销。基本上,如果执行solve_aco()花费很长时间(许多毫秒),请使用ProcessPoolExecutor。如果没有,那么最好只在一个线程中工作。