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()