Я использую модуль concurrent.futures для многопроцессорной обработки и многопоточности. Я запускаю его на 8-ядерном компьютере с 16 ГБ оперативной памяти, процессором Intel i7 8-го поколения. Я пробовал это на Python 3.7.2 и даже на Python 3.8.2
import concurrent.futures
import time
берет список и умножает каждый элемент на 2
def double_value(x):
y = []
for elem in x:
y.append(2 *elem)
return y
умножает элемент на 2
def double_single_value(x):
return 2* x
определяет функцию
import numpy as np
a = np.arange(100000000).reshape(100, 1000000)
для запуска нескольких потоков и нескольких элементов на 2
def get_double_value(x):
with concurrent.futures.ThreadPoolExecutor() as executor:
results = executor.map(double_single_value, x)
return list(results)
, показанный ниже код выполняется за 115 секунд. Это использует только многопроцессорность. Использование ЦП для этого фрагмента кода составляет 100%
t = time.time()
with concurrent.futures.ProcessPoolExecutor() as executor:
my_results = executor.map(double_value, a)
print(time.time()-t)
Функция, приведенная ниже, заняла более 9 минут и потребила всю оперативную память системы, а затем система завершила весь процесс. Кроме того, загрузка ЦП во время этого фрагмента кода не достигает 100% (~ 85%)
t = time.time()
with concurrent.futures.ProcessPoolExecutor() as executor:
my_results = executor.map(get_double_value, a)
print(time.time()-t)
Я действительно хочу понять:
1) почему код, который сначала разбивается, выполняет многократную обработку а затем запустите пробную многопоточность, не работает быстрее, чем код, который запускает только многопроцессорность? Потоковая обработка предназначена для процессов ввода-вывода и многопроцессорности для процессов ЦП?) 2) Есть ли лучший способ сделать многопоточность внутри многопроцессорной обработки для максимального использования выделенного ядра (или ЦП)?
3) Почему последний фрагмент кода занимал всю оперативную память? Это было из-за многопоточности?