Вы можете передать словарь, но операция map
над словарем обеспечивает только словарь keys . Если вы хотите, чтобы элементы в словаре, использовали dict.items
, что-то вроде:
import multiprocessing
def function(item):
name, a = item
print("{}'s number squared:".format(name))
return a**2
if __name__ == '__main__': # you must guard your multiprocessing calls!
b = dict(bob=1, dave=2, stan=3)
with multiprocessing.Pool(processes=4) as pool:
vals = pool.imap(function, list(b.items()))
for i in vals:
print(i)
Или вы можете использовать imap
, если хотите, чтобы эта же сигнатура функции работала:
import multiprocessing
def function(name, a):
print("{}'s number squared:".format(name))
return a**2
if __name__ == '__main__': # you must guard your multiprocessing calls!
b = dict(bob=1, dave=2, stan=3)
with multiprocessing.Pool(processes=4) as pool:
vals = pool.starmap(function, list(b.items()))
for i in vals:
print(i)
Другой подход состоит в том, чтобы использовать глобальную переменную и передать dict напрямую pool.map
, хотя это может быть немного уродливо:
import multiprocessing
def function(name):
a = b[name]
print("{}'s number squared:".format(name))
return a**2
b = dict(bob=1, dave=2, stan=3)
if __name__ == '__main__': # you must guard your multiprocessing calls!
with multiprocessing.Pool(processes=4) as pool:
vals = pool.imap(function, b)
for i in vals:
print(i)
Обратите внимание, я использовал muliprocessing.Pool
как менеджер контекста, поэтому при выходе из блока with
пул гарантированно будет закрыт независимо от того, что произойдет. Это лучшая практика.