我想在多个线程上运行一个进程,但是在每次迭代之后,进程应该等待全局进程完成。更具体地说:
我有一个“蚂蚁”列表,所有这些蚂蚁都在图上构建游览(我想同时进行)。这在许多迭代中发生了很多次。每个蚂蚁完成迭代之后,我想更新该图。我怎样才能最好地做到这一点?我有一些代码:
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()进行一些操作,但是我似乎无法弄清楚在哪里以及如何正确等待/通知线程。
提前谢谢!
答案 0 :(得分:1)
使用concurrent.futures.wait()
(https://docs.python.org/3/library/concurrent.futures.html#module-functions),您可以等待工作线程中的工作完成后再继续。
BTW:由于全局解释器锁定,如果您在solve_aco中所做的工作全部发生在纯Python代码中,那么多线程将不会提高性能。您可以使用ProcessPoolExecutor
来代替,尽管它会带来更多开销。基本上,如果执行solve_aco()
花费很长时间(许多毫秒),请使用ProcessPoolExecutor。如果没有,那么最好只在一个线程中工作。