Python3 ожидание завершения всех асинхронных c потоков - PullRequest
0 голосов
/ 18 июня 2020

Мне нужно запустить от 64 до 256 сетевых тестов, каждый из которых занимает разное количество времени (большинство из них от 10 до 30 секунд).

Я просто использую систему ("целевой файл сетевого_кода") в debian. Это работает, но чертовски медленно, так как каждый вызов ожидает следующего, чтобы завершить sh.

на C ++ Я бы сделал что-то вроде


#pragma omp parallel for
for(int i = 0; i < 256;i++)
{
 system("network_app");
}

, что по-прежнему невероятно глупо, но как минимум в 16 раз быстрее, чем делать это один за другим.

Как вы можете запустить X asyn c потоков в Python параллельно и дождаться завершения всех?

my_hosts = [...]

for host in my_hosts:
 execute_in_parallel(system("network_app " + host + " > " + host + ".dump"))

wait_until_are_all_jobs_are_finished()

1 Ответ

0 голосов
/ 27 июня 2020

Я использовал многопоточность для решения проблемы, так как мои команды содержат IO Bound (долгое время ожидания доступа к диску). Не используйте это для задач вычисления границы, используйте в этом случае numby.

import threading

def my_function(argument1, argument2):
 with open(argument1+"."+argument2, "r") as my_file:
 a = 1
 #do some stuff


if __name__ == "__main__":

threadlist = []

 for i in range (100):
    t = threading.Thread(target=my_function, args=(argument1,argument2))
    threadlist.append(t)

    for thread in threadlist:
        thread.start()
        
    for thread in threadlist:
        thread.join()
...