Я пытаюсь изменить сценарий Python для многопроцессорности с помощью "Процесса". Проблема в том, что он не работает. На первом этапе содержимое извлекается последовательно (test1, test2). Во втором он должен вызываться параллельно (test1 и test2). Практически нет разницы в скорости. Если вы выполняете функции отдельно, вы заметите разницу. На мой взгляд, распараллеливание должно занимать дольше всего самого продолжительного индивидуального процесса. Что мне здесь не хватает?
import multiprocessing
import time
def test1(k):
k = k * k
for e in range(1, k):
e = e**k
def test2(k):
k = k * k
for e in range(1, k):
e = e + 5 - 5*k ** 4000
if __name__ == '__main__':
start = time.time()
test1(100)
test2(100)
end = time.time()
print(end-start)
start = time.time()
worker_1 = multiprocessing.Process(target=test1(100))
worker_1.start()
worker_2 = multiprocessing.Process(target=test2, args=(100,))
worker_2.start()
worker_1.join()
worker_2.join()
end = time.time()
print(end-start)
Я хочу добавить, что я проверил диспетчер задач и увидел, что используется только 1 ядро. (4 реальных Core только 25% CPU => 1Содержание 100%)
Я знаю класс пула, но я не хочу его использовать.
Спасибо за помощь.
Привет всем, тот, у кого "опечатка", был неблагоприятным. Извини за это. Бакуриу, спасибо за ваш ответ. На самом деле, ты прав. Я думаю, что это была опечатка и слишком много работы. :-( Так что я снова изменил пример. Для всех, кто заинтересован:
Я создаю две функции, в первой части main я выполняю 3 раза функции последовательно. Мой компьютер требует ок. 36 сек. Затем я запускаю два новых процесса. Они вычисляют их результаты здесь параллельно. В качестве небольшого дополнения процесс обработки самой программы также вычисляет функцию test1, которая должна показать, что сама основная программа также может что-то сделать. Я получаю вычислительное время 12 секунд. Чтобы это было понятно для всех в Интернете, это означает, что я когда-то прикрепил картину здесь. Диспетчер задач
import multiprocessing
import time
def test1(k):
k = k * k
for e in range(1, k):
e = e**k
def test2(k):
k = k * k
for e in range(1, k):
e = e**k
if __name__ == '__main__':
start = time.time()
test1(100)
test2(100)
test1(100)
end = time.time()
print(end-start)
start = time.time()
worker_1 = multiprocessing.Process(target=test1, args=(100,))
worker_1.start()
worker_2 = multiprocessing.Process(target=test2, args=(100,))
worker_2.start()
test1(100)
worker_1.join()
worker_2.join()
end = time.time()
print(end-start)
Ваш код выполняется последовательно, потому что вместо передачи test1
в target
аргумент Process
вы передаете результат test1
!
Вы хотите сделать это:
worker_1 = multiprocessing.Process(target=test1, args=(100,))
Как и в другом случае, не так:
worker_1 = multiprocessing.Process(target=test1(100))
Этот код сначала выполняет test1(100)
, а затем возвращает None
и назначает это для того, чтобы target
нереста "пустой процесс". После этого вы создаете второй процесс, который выполняет test2(100)
. Таким образом, вы последовательно выполняете код и добавляете накладные расходы на создание двух процессов.
test1
занимает почти все время. Я попытался запустить вашу программу, печатая время для первой и второй задачи последовательно, а затем время для параллельной версии. Числа: первая задача: 8.730686902999878
, вторая задача 2.1878798008
, обе задачи параллельно 8.73914003372
. Как вы можете видеть , что параллельная версия работает в то же время , как задача , которая заканчивается последним. К сожалению, эта задача длится намного дольше, чем однажды, поэтому она плохо распараллеливается