Многопроцессорная обработка с фиксированным параметром для каждого ядра - PullRequest
0 голосов
/ 27 февраля 2020

Я бы хотел запустить многопроцессорную python, и мне кажется, что я понимаю базовый c пул, pool.apply_asyn c и процесс. Однако есть ли способ запустить pool.apply_asyn c с фиксированными параметрами каждого ядра? Например, когда 4 человека работают на вас, чтобы разрезать бумаги, и у каждого из них есть ножницы, но они не будут делиться своими ножницами друг с другом.

Я думаю, что использую pool.apply_asyn c (весело c , arg) распределит вашу нагрузку по ядрам, однако, было бы возможно, чтобы каждое ядро ​​содержало фиксированный аргумент, который может быть получен fun c в качестве параметра (я предполагаю, что он не будет в arg, потому что arg это просто нормальный параметр)?

1 Ответ

0 голосов
/ 27 февраля 2020

Pool не настроен для параметризации каждого рабочего процесса в отдельности. Но вы можете передать инициализатор generi c каждому процессу, если вы сможете найти способ для этого процесса сделать что-то уникальное (например, заблокировать, прочитать и удалить файл), и тогда вы сможете что-то взломать вместе. Трубы на уровне операционной системы и очереди сообщений интересны, но я попробовал Manager.Queue, и это, похоже, помогло.

import multiprocessing as mp
import os
import time

def _pool_init(q):
    global unique_thing
    unique_thing = q.get()
    print("process {} unique {}".format(os.getpid(), unique_thing))

def _pool_worker(param):
    time.sleep(.1) # work really hard
    return "{}: {}".format(unique_thing, param)

def test():
    # distribute unique things to the processes running the pool
    unique_things = [1,2,3,4]
    init_q = mp.Manager().Queue()
    for u in unique_things:
        init_q.put(u)
    pool = mp.Pool(len(unique_things), initializer=_pool_init, initargs=(init_q,))
    for result in pool.map(_pool_worker, 'ABCDEFG'):
        print(result)

if __name__ == "__main__":
    import sys
    if len(sys.argv) == 2:
        mp.set_start_method(sys.argv[1]) # "spawn" windows style or "fork" linux style
    test()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...