Многопроцессорная обработка с помощью Python Process

1

Я пытаюсь изменить сценарий 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)
  • 0
    «Я знаю Pool Class, но я не хочу его использовать». Почему? Я думаю, что вы запускаете процессы последовательно и запускаете только один процесс каждый раз, поэтому нет причин для его ускорения.
  • 0
    @roganjosh С моей точки зрения, многопроцессорность - это парализующий пакет Python с классами Pool и Process. Оба позволяют параллельную обработку. Или это неправильно? Это мини пример. Мой настоящий код очень длинный, но он отражает проблему.
Показать ещё 4 комментария
Теги:
parallel-processing
multiprocessing
process

1 ответ

0

Ваш код выполняется последовательно, потому что вместо передачи 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). Таким образом, вы последовательно выполняете код и добавляете накладные расходы на создание двух процессов.

  • 0
    Спасибо за ответ, который хотя бы объясняет ошибку в коде. Однако настоящая проблема все еще существует, и я использую только одно ядро, а не два, как я думал.
  • 0
    @Airfox Кажется, что test1 занимает почти все время. Я попытался запустить вашу программу, печатая время для первой и второй задачи последовательно, а затем время для параллельной версии. Числа: первая задача: 8.730686902999878 , вторая задача 2.1878798008 , обе задачи параллельно 8.73914003372 . Как вы можете видеть , что параллельная версия работает в то же время , как задача , которая заканчивается последним. К сожалению, эта задача длится намного дольше, чем однажды, поэтому она плохо распараллеливается
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню