Jawabannya bergantung pada versi dan situasi. Jawaban paling umum untuk versi terbaru Python (sejak 3.3) pertama kali dijelaskan di bawah ini oleh JF Sebastian . 1 Menggunakan Pool.starmap
metode, yang menerima urutan argumen tuple. Itu kemudian secara otomatis membongkar argumen dari setiap tuple dan meneruskannya ke fungsi yang diberikan:
import multiprocessing
from itertools import product
def merge_names(a, b):
return '{} & {}'.format(a, b)
if __name__ == '__main__':
names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
with multiprocessing.Pool(processes=3) as pool:
results = pool.starmap(merge_names, product(names, repeat=2))
print(results)
# Output: ['Brown & Brown', 'Brown & Wilson', 'Brown & Bartlett', ...
Untuk versi Python sebelumnya, Anda harus menulis fungsi pembantu untuk membongkar argumen secara eksplisit. Jika Anda ingin menggunakan with
, Anda juga harus menulis pembungkus untuk berubah Pool
menjadi manajer konteks. (Terima kasih kepada muon untuk menunjukkan ini.)
import multiprocessing
from itertools import product
from contextlib import contextmanager
def merge_names(a, b):
return '{} & {}'.format(a, b)
def merge_names_unpack(args):
return merge_names(*args)
@contextmanager
def poolcontext(*args, **kwargs):
pool = multiprocessing.Pool(*args, **kwargs)
yield pool
pool.terminate()
if __name__ == '__main__':
names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
with poolcontext(processes=3) as pool:
results = pool.map(merge_names_unpack, product(names, repeat=2))
print(results)
# Output: ['Brown & Brown', 'Brown & Wilson', 'Brown & Bartlett', ...
Dalam kasus yang lebih sederhana, dengan argumen kedua tetap, Anda juga bisa menggunakan partial
, tetapi hanya dengan Python 2.7+.
import multiprocessing
from functools import partial
from contextlib import contextmanager
@contextmanager
def poolcontext(*args, **kwargs):
pool = multiprocessing.Pool(*args, **kwargs)
yield pool
pool.terminate()
def merge_names(a, b):
return '{} & {}'.format(a, b)
if __name__ == '__main__':
names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
with poolcontext(processes=3) as pool:
results = pool.map(partial(merge_names, b='Sons'), names)
print(results)
# Output: ['Brown & Sons', 'Wilson & Sons', 'Bartlett & Sons', ...
1. Banyak dari ini terinspirasi oleh jawabannya, yang seharusnya diterima sebagai gantinya. Tapi karena yang satu ini macet di puncak, sepertinya lebih baik untuk memperbaikinya bagi pembaca masa depan.
partial
ataulambda
melakukan ini. Saya pikir itu ada hubungannya dengan cara aneh bahwa fungsi dilewatkan ke subproses (viapickle
).