Этот (чрезвычайно упрощенный пример)отлично работает (Python 2.6.6, Debian Squeeze):
from multiprocessing import Pool
import numpy as np
src=None
def process(row):
return np.sum(src[row])
def main():
global src
src=np.ones((100,100))
pool=Pool(processes=16)
rows=pool.map(process,range(100))
print rows
if __name__ == "__main__":
main()
однако после многих лет обученияглобальное состояние плохо!!!, все мои инстинкты подсказывали мне, что я действительно хотел бы написать что-то близкое к :
from multiprocessing import Pool
import numpy as np
def main():
src=np.ones((100,100))
def process(row):
return np.sum(src[row])
pool=Pool(processes=16)
rows=pool.map(process,range(100))
print rows
if __name__ == "__main__":
main()
, но, конечно, это не работает (зависает, не в силах что-то состряпать).
Пример здесь тривиален, но к тому времени, когда вы добавите несколько «процессных» функций, и каждая из них будет зависеть от нескольких дополнительных входных данных… все это станет немного напоминать что-то, написанное на Бейсике 30 лет назад. Попытка использовать классы, по крайней мере, для объединения состояния с соответствующими функциями кажется очевидным решением, но на практике это не так просто .
Есть ли какой-нибудь рекомендуемый шаблон или стиль использования multiprocessing.pool, который позволит избежать распространения глобального состояния для поддержки каждой функции, которую я хочу распараллелить?
Как с этим справляются опытные «мультипроцессоры»?
Обновление:Обратите внимание, что я на самом деле заинтересован в обработке гораздо больших массивов, поэтому вариации вышеприведенного выбора src
каждого вызова/итерации не так хороши, как те, которые разветвляют его в рабочие процессы пула..