Многопроцессорность - как запустить несколько процессов параллельно - PullRequest
2 голосов
/ 29 марта 2020

Недавно я экспериментировал с многопроцессорным модулем. Я написал этот скрипт для проверки:

import multiprocessing
from time import sleep
import datetime

def b(m):
   print(m)

def int_val(a):
   b(a)

def char_val(a):
   sleep(15)
   b(a)

list_val = [1,2,'c',6,10,1,'e',11,78,'a', 'b']

if __name__ == '__main__':
   p = multiprocessing.Pool(4)
   for index, val in enumerate(list_val):
      if isinstance(val, str):
         p.map(char_val, [val])
         print(datetime.datetime.now())
      else:
         p.map(int_val, [val])
         print(datetime.datetime.now())

Вывод выглядит так:

1
2020-03-29 01:45:37.099114
2
2020-03-29 01:45:37.099114
c
2020-03-29 01:45:52.114733
6
2020-03-29 01:45:52.114733
10
2020-03-29 01:45:52.114733
1
2020-03-29 01:45:52.114733
e
2020-03-29 01:46:07.115963
11
2020-03-29 01:46:07.115963
78
2020-03-29 01:46:07.115963
a
2020-03-29 01:46:22.117232
b
2020-03-29 01:46:37.118046

Если мы увидим вывод, программа не достигла многопроцессорной обработки, которую я искал за.

Я надеялся, что пока программа ожидает 15 секунд для элемента 'c', другие элементы будут обработаны, и почти все символы будут напечатаны одновременно.

Это может быть глупый вопрос, но я действительно потерян!

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 29 марта 2020

Вы вызываете p.map итеративно для каждого элемента списка, так что по сути вы создаете новый процесс для каждого элемента. Поскольку p.map является блокирующим вызовом, он фактически ожидает выполнения char_val('c'), прежде чем двигаться дальше.

Если вы передаете целое list_val p.map(), вы должны получить ожидаемую последовательность выполнения

import multiprocessing
from time import sleep
import datetime

def b(m):
   print(m)

def int_val(a):
   b(a)

def char_val(a):
   sleep(15)
   b(a)

def f(val):
    if isinstance(val, str):
        char_val(val)
        print(datetime.datetime.now())
    else:
        int_val(val)
        print(datetime.datetime.now())

list_val = [1,2,'c',6,10,1,'e',11,78,'a', 'b']

if __name__ == '__main__':
   p = multiprocessing.Pool(4)
   p.map(f, list_val)
   # for index, val in enumerate(list_val):
      # if isinstance(val, str):
         # p.map(char_val, [val])
         # print(datetime.datetime.now())
      # else:
         # p.map(int_val, [val])
         # print(datetime.datetime.now())

Вывод:

1
2020-03-29 11:38:15.373607
2
2020-03-29 11:38:15.373764
6
2020-03-29 11:38:15.374008
10
1
2020-03-29 11:38:15.374117
2020-03-29 11:38:15.374108
11
2020-03-29 11:38:15.374233
78
2020-03-29 11:38:15.374438
c
a
2020-03-29 11:38:30.388652
2020-03-29 11:38:30.388761
e
b
2020-03-29 11:38:30.389465
2020-03-29 11:38:30.389566
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...