пытаюсь понять многопроцессорность

#python #multiprocessing

#python #многопроцессорная обработка

Вопрос:

Я начинаю учиться использовать многопроцессорную обработку, и лучшее, чему можно научиться, — это провести несколько проб и посмотреть, что получится. Так я и сделал, но с моей первой попытки у меня получилось кое-что, что я не уверен, что понимаю, поэтому я был бы признателен за ваши комментарии или исправления:

Итак, я сделал очень простую программу, просто прочитал pytable и распечатал результаты, в зависимости от одного заданного параметра:

 from tables import *
import scipy as sc

def getP(pathToTable, p):

    with openFile(pathToTable,'r') as f:

        tab = f.getNode("/mainTab")
        a = [row['value'] for row in tab.where("(page == p) amp; (ok == 1)")]   

        print (p, sc.mean(a), sc.std(a))
 

И, чтобы проверить это, я делаю вот так:

 >>> import multiprocessing
>>>pags = [1,2,3,4,5,6,7,8]
>>> te = 'C:DesktoptestMultiProc.h5'
>>>import testMp as m
>>> for i in pags:
...     p = multiprocessing.Process(target=m.getP, args=(te,i))
...     p.start()
...     p.join()
... 
 

Это работает, и я получаю такие результаты:

 (1, 9.0953793794588282, 0.33533126564851207)
(2, 9.0871612678994946, 0.33453983570210977)
(3, 9.0466206717415556, 0.32227094723414906)
(4, 9.1115445293825204, 0.32247317223440275)
(5, 9.1731876730458826, 0.33230456228097616)
(6, 8.9801903625732713, 0.32238759095899067)
(7, 9.0102797573336719, 0.34441213144617178)
(8, 8.8340961470191885, 0.32342748738790894)
 

Итак, вот мои вопросы:

Если я не ошибаюсь, это происходит одновременно, тогда почему я получаю выходные данные по порядку?? Я имею в виду, допустим, что при p = 3 процесс завершается первым, потому что в таблице с p = 3 мало значений, так почему же я не получаю (3, 9.0466206717415556, 0.32227094723414906) в качестве первого вывода, например??

Это заставляет меня думать, что либо я делаю это неправильно, либо я еще не понимаю, что здесь происходит.

Я выбрал pags = [1,2,3,4,5,6,7,8] с учетом идеи….Я сделал это, потому что сначала я сделал:

 >>> multiprocessing.cpu_count()
8
 

Итак, моя идея состояла в том, чтобы зафиксировать прибыль в размере 8 ядер.

Ответ №1:

Нет, это происходит не одновременно, потому что вы вызываете join .

join будет блокироваться до тех пор, пока процесс не будет завершен.

Эффективно:

  1. Вы запускаете отдельный процесс для обработки первого элемента
  2. Вы ждете завершения этого процесса
  3. Вы запускаете отдельный процесс для работы со вторым пунктом
  4. Вы ждете завершения этого процесса
  5. … и так далее

Вам нужно отбросить join вызов внутри этого цикла. Если вы хотите дождаться завершения всех подпроцессов, сохраните результат вызова multiprocessing.Process и объединения этих значений в отдельном цикле, что-то вроде (непроверенный):

 processes = []
for i in pags:
    p = multiprocessing.Process(target=m.getP, args=(te,i))
    p.start()
    processes  = [p]

for p in processes:
    p.join()
 

Комментарии:

1. Спасибо Лассе, да, это звучит на самом деле так, как я хочу достичь, я хочу, чтобы все процессы запускались и выполнялись вовремя, параллельно (чтобы сэкономить время обработки), но в конце я хочу, чтобы весь процесс подождал, пока все они не завершатся раньше continuig…to будьте особенными…. Если в самом конце есть сообщение "Job Finished" , оно должно отображаться только в том случае, если все 8 или N процессов завершены….