Python: ожидание продолжения всех потоков в определенной точке кода для продолжения - PullRequest
0 голосов
/ 28 мая 2019

Я хочу запустить процесс в нескольких потоках, но после каждой итерации процессы должны ждать завершения глобального процесса. Более конкретно:

У меня есть список "муравьев", которые все строят тур на графике (это я хочу сделать одновременно). Это происходит много раз за много итераций. После того, как каждый муравей завершил свою итерацию, я хочу обновить график. Как я могу лучше всего это сделать? какой-то код у меня есть:

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 Ответ

1 голос
/ 28 мая 2019

С concurrent.futures.wait() (https://docs.python.org/3/library/concurrent.futures.html#module-functions) вы можете дождаться завершения работы в рабочих потоках, прежде чем продолжить.

Кстати: из-за глобальной блокировки интерпретатора, если работавыполнение в solve_aco всего происходит в чистом коде Python, многопоточность не даст вам прироста производительности. Вместо этого вы можете использовать ProcessPoolExecutor, хотя это требует больше накладных расходов. В основном, если выполнение solve_aco() занимает много времени (много миллисекунд), используйте ProcessPoolExecutor. Если нет, то вам, вероятно, лучше просто работать в одном потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...