Câu trả lời cho điều này là phụ thuộc vào phiên bản và tình huống. Câu trả lời chung nhất cho các phiên bản gần đây của Python (kể từ 3.3) lần đầu tiên được mô tả dưới đây bởi JF Sebastian . 1 Nó sử dụng Pool.starmap
phương thức chấp nhận một chuỗi các bộ đối số. Sau đó, nó sẽ tự động giải nén các đối số từ mỗi bộ dữ liệu và chuyển chúng đến hàm đã cho:
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', ...
Đối với các phiên bản trước của Python, bạn sẽ cần viết hàm trợ giúp để giải nén các đối số một cách rõ ràng. Nếu bạn muốn sử dụng with
, bạn cũng cần phải viết một trình bao bọc để biến Pool
thành trình quản lý bối cảnh. (Cảm ơn muon vì đã chỉ ra điều này.)
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', ...
Trong các trường hợp đơn giản hơn, với một đối số thứ hai cố định, bạn cũng có thể sử dụng partial
, nhưng chỉ trong 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. Phần lớn điều này được lấy cảm hứng từ câu trả lời của anh ấy, có lẽ nên được chấp nhận thay thế. Nhưng vì cái này bị kẹt ở đầu, có vẻ như tốt nhất để cải thiện nó cho độc giả trong tương lai.
partial
cũng khônglambda
làm điều này. Tôi nghĩ rằng nó phải làm theo cách kỳ lạ là các chức năng được truyền cho các quy trình con (thông quapickle
).