Альтернативные шаблоны использования для многопроцессорной обработки Python, позволяющие избежать распространения глобального состояния?

Этот (чрезвычайно упрощенный пример)отлично работает (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каждого вызова/итерации не так хороши, как те, которые разветвляют его в рабочие процессы пула..

7
задан Community 23 May 2017 в 10:34
поделиться