#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
будет блокироваться до тех пор, пока процесс не будет завершен.
Эффективно:
- Вы запускаете отдельный процесс для обработки первого элемента
- Вы ждете завершения этого процесса
- Вы запускаете отдельный процесс для работы со вторым пунктом
- Вы ждете завершения этого процесса
- … и так далее
Вам нужно отбросить 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 процессов завершены….