Я попытаюсь привести простой фиктивный пример, надеясь, что вы сможете вывести модификацию, необходимую для вашего кода:
вот кодовая версия обычного цикла:
id_array = [*range(10)]
result = []
for id in id_array:
if id % 2 == 0:
result.append((id, id))
else:
result.append((id, id ** 2))
print(result)
Выход:
[(0, 0), (1, 1), (2, 2), (3, 9), (4, 4), (5, 25), (6, 6), (7, 49 ), (8, 8), (9, 81)]
Здесь, используя ProcessPoolExecutor
, я распараллелил его на 4 процесса:
from concurrent.futures import ProcessPoolExecutor
id_array = [*range(10)]
def myfunc(id):
if id % 2 == 0:
return id, id
else:
return id, id ** 2
result = []
with ProcessPoolExecutor(max_workers=4) as executor:
for r in executor.map(myfunc, id_array):
result.append(r)
print(result)
Вывод (тоже самое):
[(0, 0), (1, 1), (2, 2), (3, 9), (4, 4), (5, 25), (6, 6), (7, 49 ), (8, 8), (9, 81)]
в основном:
- извлекает содержимое
for
в функцию, которая возвращает желаемое значение
- использовать
ProcessPoolExecutor
с executor.map(myfunc, id_array)
- добавить возвращаемое значение в список результатов.