Có một biến thể của pool.map hỗ trợ nhiều đối số?
Python 3.3 bao gồm phương thức
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', ...
6:#!/usr/bin/env python3
from functools import partial
from itertools import repeat
from multiprocessing import Pool, freeze_support
def func[a, b]:
return a + b
def main[]:
a_args = [1,2,3]
second_arg = 1
with Pool[] as pool:
L = pool.starmap[func, [[1, 1], [2, 1], [3, 1]]]
M = pool.starmap[func, zip[a_args, repeat[second_arg]]]
N = pool.map[partial[func, b=second_arg], a_args]
assert L == M == N
if __name__=="__main__":
freeze_support[]
main[]
Cho các phiên bản cũ hơn:
#!/usr/bin/env python2
import itertools
from multiprocessing import Pool, freeze_support
def func[a, b]:
print a, b
def func_star[a_b]:
"""Convert `f[[1,2]]` to `f[1,2]` call."""
return func[*a_b]
def main[]:
pool = Pool[]
a_args = [1,2,3]
second_arg = 1
pool.map[func_star, itertools.izip[a_args, itertools.repeat[second_arg]]]
if __name__=="__main__":
freeze_support[]
main[]
Đầu ra
1 1
2 1
3 1
Lưu ý cách
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', ...
7 và 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', ...
8 được sử dụng ở đây.
Do lỗi được đề cập bởi @unutbu, bạn không thể sử dụng
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', ...
9 hoặc các khả năng tương tự trên Python 2.6, do đó, chức năng trình bao bọc đơn giản 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', ...
0 nên được xác định rõ ràng. Xem thêm Cách giải quyết được đề xuất bởi 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.Đã trả lời ngày 26 tháng 3 năm 2011 lúc 17:24Mar 26, 2011 at 17:24
JFSJFSjfs
385K183 Huy hiệu vàng949 Huy hiệu bạc1624 Huy hiệu đồng183 gold badges949 silver badges1624 bronze badges
14
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] được mô tả lần đầu tiên dưới đây bởi J.F. Sebastian.1 Nó sử dụng phương pháp
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', ...
2, chấp nhận một chuỗi các bộ đếm đối số. Sau đó, nó tự động giải nén các đối số khỏi mỗi tuple và chuyển chúng đến chức năng đã 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 mộ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
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', ...
3, bạn cũng sẽ cần viết trình bao bọc để biến 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', ...
4 thành trình quản lý ngữ cảnh. [Cảm ơn Muon đã 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
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', ...
5, 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 truyền 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ị mắc kẹt ở đầu, nên có vẻ tốt nhất để cải thiện nó cho độc giả trong tương lai.
Đã trả lời ngày 26 tháng 3 năm 2011 lúc 14:36Mar 26, 2011 at 14:36
người gửisenderle
Huy hiệu vàng 140K3535 gold badges206 silver badges231 bronze badges
9
Tôi nghĩ rằng dưới đây sẽ tốt hơn:
def multi_run_wrapper[args]:
return add[*args]
def add[x,y]:
return x+y
if __name__ == "__main__":
from multiprocessing import Pool
pool = Pool[4]
results = pool.map[multi_run_wrapper,[[1,2],[2,3],[3,4]]]
print results
Đầu ra
[3, 5, 7]
Lưu ý cách
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', ...
7 và 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', ...
8 được sử dụng ở đây.Jan 15, 2014
at 6:01
Do lỗi được đề cập bởi @unutbu, bạn không thể sử dụng
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', ...
9 hoặc các khả năng tương tự trên Python 2.6, do đó, chức năng trình bao bọc đơn giản 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', ...
0 nên được xác định rõ ràng. Xem thêm Cách giải quyết được đề xuất bởi 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.imotaiĐã trả lời ngày 26 tháng 3 năm 2011 lúc 17:241 gold badge11 silver badges9 bronze badges
6
JFSJFSPython 3.3+ with
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', ...
6from multiprocessing.dummy import Pool as ThreadPool
def write[i, x]:
print[i, "---", x]
a = ["1","2","3"]
b = ["4","5","6"]
pool = ThreadPool[2]
pool.starmap[write, zip[a,b]]
pool.close[]
pool.join[]
Result:
1 --- 4
2 --- 5
3 --- 6
385K183 Huy hiệu vàng949 Huy hiệu bạc1624 Huy hiệu đồng
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] được mô tả lần đầu tiên dưới đây bởi J.F. Sebastian.1 Nó sử dụng phương pháp
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', ...
2, chấp nhận một chuỗi các bộ đếm đối số. Sau đó, nó tự động giải nén các đối số khỏi mỗi tuple và chuyển chúng đến chức năng đã cho:constant value passed as an argument:#!/usr/bin/env python2
import itertools
from multiprocessing import Pool, freeze_support
def func[a, b]:
print a, b
def func_star[a_b]:
"""Convert `f[[1,2]]` to `f[1,2]` call."""
return func[*a_b]
def main[]:
pool = Pool[]
a_args = [1,2,3]
second_arg = 1
pool.map[func_star, itertools.izip[a_args, itertools.repeat[second_arg]]]
if __name__=="__main__":
freeze_support[]
main[]
0Đối với các phiên bản trước của Python, bạn sẽ cần viết mộ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
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', ...
3, bạn cũng sẽ cần viết trình bao bọc để biến 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', ...
4 thành trình quản lý ngữ cảnh. [Cảm ơn Muon đã chỉ ra điều này.]return something:#!/usr/bin/env python2
import itertools
from multiprocessing import Pool, freeze_support
def func[a, b]:
print a, b
def func_star[a_b]:
"""Convert `f[[1,2]]` to `f[1,2]` call."""
return func[*a_b]
def main[]:
pool = Pool[]
a_args = [1,2,3]
second_arg = 1
pool.map[func_star, itertools.izip[a_args, itertools.repeat[second_arg]]]
if __name__=="__main__":
freeze_support[]
main[]
1Trong 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
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', ...
5, nhưng chỉ trong Python 2.7+.1. Phần lớn điều này được truyền 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ị mắc kẹt ở đầu, nên có vẻ tốt nhất để cải thiện nó cho độc giả trong tương lai.Mar 10, 2015 at 22:24
user136036user136036user136036
Đã trả lời ngày 26 tháng 3 năm 2011 lúc 14:366 gold badges43 silver badges46 bronze badges
2
người gửi
#!/usr/bin/env python2
import itertools
from multiprocessing import Pool, freeze_support
def func[a, b]:
print a, b
def func_star[a_b]:
"""Convert `f[[1,2]]` to `f[1,2]` call."""
return func[*a_b]
def main[]:
pool = Pool[]
a_args = [1,2,3]
second_arg = 1
pool.map[func_star, itertools.izip[a_args, itertools.repeat[second_arg]]]
if __name__=="__main__":
freeze_support[]
main[]
2
lpd11
Huy hiệu vàng 140K351 silver badge7 bronze badges
Tôi nghĩ rằng dưới đây sẽ tốt hơn:Dec 25, 2017 at 11:44
Đã trả lời ngày 15 tháng 1 năm 2014 lúc 6:01Dane Lee
imotaiimotai11 silver badges14 bronze badges
4
1.9161 Huy hiệu vàng11 Huy hiệu bạc9 Huy hiệu đồng
Sử dụng Python 3.3+ với
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', ...
6#!/usr/bin/env python2
import itertools
from multiprocessing import Pool, freeze_support
def func[a, b]:
print a, b
def func_star[a_b]:
"""Convert `f[[1,2]]` to `f[1,2]` call."""
return func[*a_b]
def main[]:
pool = Pool[]
a_args = [1,2,3]
second_arg = 1
pool.map[func_star, itertools.izip[a_args, itertools.repeat[second_arg]]]
if __name__=="__main__":
freeze_support[]
main[]
3Bạn cũng có thể zip [] thêm đối số nếu bạn thích:
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', ...
7#!/usr/bin/env python2
import itertools
from multiprocessing import Pool, freeze_support
def func[a, b]:
print a, b
def func_star[a_b]:
"""Convert `f[[1,2]]` to `f[1,2]` call."""
return func[*a_b]
def main[]:
pool = Pool[]
a_args = [1,2,3]
second_arg = 1
pool.map[func_star, itertools.izip[a_args, itertools.repeat[second_arg]]]
if __name__=="__main__":
freeze_support[]
main[]
4Trong trường hợp bạn muốn có một giá trị không đổi được thông qua như một đối số:
Trong trường hợp chức năng của bạn sẽ trả về một cái gì đó:
#!/usr/bin/env python2
import itertools
from multiprocessing import Pool, freeze_support
def func[a, b]:
print a, b
def func_star[a_b]:
"""Convert `f[[1,2]]` to `f[1,2]` call."""
return func[*a_b]
def main[]:
pool = Pool[]
a_args = [1,2,3]
second_arg = 1
pool.map[func_star, itertools.izip[a_args, itertools.repeat[second_arg]]]
if __name__=="__main__":
freeze_support[]
main[]
5
Điều này đưa ra một danh sách với các giá trị được trả về.Jan 22, 2014 at 20:05
Đã trả lời ngày 10 tháng 3 năm 2015 lúc 22:24zeehio
10.1k6 Huy hiệu vàng43 Huy hiệu bạc46 Huy hiệu đồng2 gold badges37 silver badges46 bronze badges
0
Cách thực hiện nhiều đối số:
1331 Huy hiệu bạc7 Huy hiệu đồng
#!/usr/bin/env python2
import itertools
from multiprocessing import Pool, freeze_support
def func[a, b]:
print a, b
def func_star[a_b]:
"""Convert `f[[1,2]]` to `f[1,2]` call."""
return func[*a_b]
def main[]:
pool = Pool[]
a_args = [1,2,3]
second_arg = 1
pool.map[func_star, itertools.izip[a_args, itertools.repeat[second_arg]]]
if __name__=="__main__":
freeze_support[]
main[]
6Đã trả lời ngày 25 tháng 12 năm 2017 lúc 11:44
#!/usr/bin/env python2
import itertools
from multiprocessing import Pool, freeze_support
def func[a, b]:
print a, b
def func_star[a_b]:
"""Convert `f[[1,2]]` to `f[1,2]` call."""
return func[*a_b]
def main[]:
pool = Pool[]
a_args = [1,2,3]
second_arg = 1
pool.map[func_star, itertools.izip[a_args, itertools.repeat[second_arg]]]
if __name__=="__main__":
freeze_support[]
main[]
7
Dane Leedane LeeJan 20, 2014 at 20:37
1.85411 huy hiệu bạc14 Huy hiệu đồngMike McKerns
Đã biết về itertools trong câu trả lời của J.F. của các đối số vị trí.8 gold badges113 silver badges138 bronze badges
4
Cài đặt
#!/usr/bin/env python2
import itertools
from multiprocessing import Pool, freeze_support
def func[a, b]:
print a, b
def func_star[a_b]:
"""Convert `f[[1,2]]` to `f[1,2]` call."""
return func[*a_b]
def main[]:
pool = Pool[]
a_args = [1,2,3]
second_arg = 1
pool.map[func_star, itertools.izip[a_args, itertools.repeat[second_arg]]]
if __name__=="__main__":
freeze_support[]
main[]
8Đầu ra
#!/usr/bin/env python2
import itertools
from multiprocessing import Pool, freeze_support
def func[a, b]:
print a, b
def func_star[a_b]:
"""Convert `f[[1,2]]` to `f[1,2]` call."""
return func[*a_b]
def main[]:
pool = Pool[]
a_args = [1,2,3]
second_arg = 1
pool.map[func_star, itertools.izip[a_args, itertools.repeat[second_arg]]]
if __name__=="__main__":
freeze_support[]
main[]
9
Cách song song hóa:May 23, 2017 at 10:11
Tôi đã tải lên Parmap lên Pypi và một kho lưu trữ GitHub.xmduhan
Ví dụ, câu hỏi có thể được trả lời như sau:11 silver badges14 bronze badges
Đã trả lời ngày 22 tháng 1 năm 2014 lúc 20:05
Zeehiozeehio3,8742 huy hiệu vàng37 Huy hiệu bạc46 Huy hiệu đồng
Có một ngã ba
def multi_run_wrapper[args]:
return add[*args]
def add[x,y]:
return x+y
if __name__ == "__main__":
from multiprocessing import Pool
pool = Pool[4]
results = pool.map[multi_run_wrapper,[[1,2],[2,3],[3,4]]]
print results
1 được gọi là Pathos [Lưu ý: Sử dụng phiên bản trên GitHub] không cần def multi_run_wrapper[args]:
return add[*args]
def add[x,y]:
return x+y
if __name__ == "__main__":
from multiprocessing import Pool
pool = Pool[4]
results = pool.map[multi_run_wrapper,[[1,2],[2,3],[3,4]]]
print results
0 - các hàm bản đồ phản ánh API cho bản đồ của Python, do đó MAP có thể có nhiều đối số.Mar 13, 2014 at 21:55
Với
def multi_run_wrapper[args]:
return add[*args]
def add[x,y]:
return x+y
if __name__ == "__main__":
from multiprocessing import Pool
pool = Pool[4]
results = pool.map[multi_run_wrapper,[[1,2],[2,3],[3,4]]]
print results
3, bạn cũng thường có thể thực hiện đa xử lý trong trình thông dịch, thay vì bị kẹt trong khối def multi_run_wrapper[args]:
return add[*args]
def add[x,y]:
return x+y
if __name__ == "__main__":
from multiprocessing import Pool
pool = Pool[4]
results = pool.map[multi_run_wrapper,[[1,2],[2,3],[3,4]]]
print results
4. Pathos là do một bản phát hành, sau khi cập nhật nhẹ - chủ yếu là chuyển đổi sang Python 3.x.Adobe
3 có một số cách mà bạn có thể có được hành vi chính xác của def multi_run_wrapper[args]:
return add[*args]
def add[x,y]:
return x+y
if __name__ == "__main__":
from multiprocessing import Pool
pool = Pool[4]
results = pool.map[multi_run_wrapper,[[1,2],[2,3],[3,4]]]
print results
0.8 gold badges83 silver badges123 bronze badgesdef multi_run_wrapper[args]:
return add[*args]
def add[x,y]:
return x+y
if __name__ == "__main__":
from multiprocessing import Pool
pool = Pool[4]
results = pool.map[multi_run_wrapper,[[1,2],[2,3],[3,4]]]
print results
4
Đã trả lời ngày 20 tháng 1 năm 2014 lúc 20:37decorator instead of writing a wrapper function by hand. Especially when you have a lot of functions to map, a decorator will save your time by avoiding writing a wrapper for every function. Usually a decorated function is not picklable, however we may use
def multi_run_wrapper[args]:
return add[*args]
def add[x,y]:
return x+y
if __name__ == "__main__":
from multiprocessing import Pool
pool = Pool[4]
results = pool.map[multi_run_wrapper,[[1,2],[2,3],[3,4]]]
print results
7 to get around it. More discussions can be found here.Mike McKernsmike McKerns
1 1
2 1
3 1
132.1k8 Huy hiệu vàng113 Huy hiệu bạc138 Huy hiệu đồng
1 1
2 1
3 1
2Một giải pháp tốt hơn cho Python & NBSP; 2:
Đã trả lời ngày 23 tháng 5 năm 2017 lúc 10:11May 29, 2016 at 1:17
xmduhanxmduhanSyrtis Major
83011 Huy hiệu bạc14 Huy hiệu đồng1 gold badge27 silver badges39 bronze badges
3
Một cách khác là chuyển danh sách các danh sách cho thói quen một đối số:
1 1
2 1
3 1
3Sử dụng chức năng
def multi_run_wrapper[args]:
return add[*args]
def add[x,y]:
return x+y
if __name__ == "__main__":
from multiprocessing import Pool
pool = Pool[4]
results = pool.map[multi_run_wrapper,[[1,2],[2,3],[3,4]]]
print results
9 với danh sách các đối số [3, 5, 7]
0, [3, 5, 7]
1 và [3, 5, 7]
2 như sau:1 1
2 1
3 1
4Đã trả lời ngày 27 tháng 6 năm 2014 lúc 7:42Jun 27, 2014 at 7:42
M. Toyam. ToyaM. Toya
5957 Huy hiệu bạc23 Huy hiệu Đồng7 silver badges23 bronze badges
Một giải pháp thay thế đơn giản khác là bọc các tham số chức năng của bạn trong một bộ thuật và sau đó bọc các tham số nên được truyền trong các bộ dữ liệu. Điều này có lẽ không lý tưởng khi xử lý các phần lớn dữ liệu. Tôi tin rằng nó sẽ tạo ra các bản sao cho mỗi tuple.
1 1
2 1
3 1
5Cung cấp đầu ra theo một số thứ tự ngẫu nhiên:
1 1
2 1
3 1
6Đã trả lời ngày 21 tháng 11 năm 2016 lúc 7:16Nov 21, 2016 at 7:16
Alex Klibiszalex KlibiszAlex Klibisz
1.2841 Huy hiệu vàng14 Huy hiệu bạc20 Huy hiệu Đồng1 gold badge14 silver badges20 bronze badges
1
Đây là một cách khác để làm điều đó rằng IMHO đơn giản và thanh lịch hơn bất kỳ câu trả lời nào khác được cung cấp.
Chương trình này có một chức năng lấy hai tham số, in chúng ra và cũng in tổng số:
1 1
2 1
3 1
7đầu ra là:
1 1
2 1
3 1
8Xem tài liệu Python để biết thêm thông tin:
//docs.python.org/3/library/multiprocessing.html#module-multiprocessing.pool
Đặc biệt, hãy chắc chắn kiểm tra chức năng
def multi_run_wrapper[args]:
return add[*args]
def add[x,y]:
return x+y
if __name__ == "__main__":
from multiprocessing import Pool
pool = Pool[4]
results = pool.map[multi_run_wrapper,[[1,2],[2,3],[3,4]]]
print results
0.Tôi đang sử dụng Python 3.6, tôi không chắc liệu điều này có hoạt động với các phiên bản Python cũ hơn không
Tại sao không có một ví dụ rất đơn giản như thế này trong tài liệu, tôi không chắc chắn.
Đã trả lời ngày 24 tháng 1 năm 2020 lúc 19:37Jan 24, 2020 at 19:37
Cdahmscdahmscdahms
3.0749 Huy hiệu vàng44 Huy hiệu bạc71 Huy hiệu đồng9 gold badges44 silver badges71 bronze badges
Từ Python 3.4.4, bạn có thể sử dụng MultiProcessing.get_context [] để có được đối tượng ngữ cảnh để sử dụng nhiều phương thức bắt đầu:
1 1
2 1
3 1
9Hoặc bạn chỉ đơn giản là thay thế
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', ...
0with:
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', ...
1
Đã trả lời ngày 27 tháng 5 năm 2016 lúc 10:52May 27, 2016 at 10:52
Tung Nguyễn năng NguyễnTung Nguyen
1.4282 Huy hiệu vàng17 Huy hiệu bạc13 Huy hiệu đồng2 gold badges17 silver badges13 bronze badges
Trong tài liệu chính thức nói rằng nó chỉ hỗ trợ một đối số có thể lặp lại. Tôi thích sử dụng Ứng dụng_async trong những trường hợp như vậy. Trong trường hợp của bạn, tôi sẽ làm:
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', ...
2Đã trả lời ngày 2 tháng 4 năm 2017 lúc 6:34Apr 2, 2017 at 6:34
roj4sroj4sroj4s
2211 Huy hiệu bạc8 Huy hiệu đồng1 silver badge8 bronze badges
1
Có nhiều câu trả lời ở đây, nhưng dường như không có câu trả lời nào cung cấp mã tương thích Python 2/3 sẽ hoạt động trên bất kỳ phiên bản nào. Nếu bạn muốn mã của mình chỉ hoạt động, điều này sẽ hoạt động cho phiên bản Python:
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', ...
3Sau đó, bạn có thể sử dụng đa xử lý Python 3 thông thường, tuy nhiên bạn thích. Ví dụ:
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', ...
4sẽ làm việc trong Python 2 hoặc Python 3.
Đã trả lời ngày 16 tháng 2 năm 2019 lúc 4:56Feb 16, 2019 at 4:56
Cgnorthcuttcgnorthcuttcgnorthcutt
3.64233 Huy hiệu bạc39 Huy hiệu đồng33 silver badges39 bronze badges
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', ...
5Đã trả lời ngày 15 tháng 10 năm 2018 lúc 23:21Oct 15, 2018 at 23:21
JaimejaimeJaime
Huy hiệu đồng 2111 bronze badge
Đây là một ví dụ về thói quen mà tôi sử dụng để chuyển nhiều đối số cho hàm một đối số được sử dụng trong Fork.imap Fork:
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', ...
6Đã trả lời ngày 23 tháng 1 năm 2019 lúc 11:53Jan 23, 2019 at 11:53
Đây có thể là một lựa chọn khác. Bí quyết là trong hàm
[3, 5, 7]
4 trả về một hàm khác được truyền vào [3, 5, 7]
5. Mã bên dưới đọc một mảng đầu vào và cho mỗi phần tử [duy nhất] trong đó, trả về số lần [tức là số lượng] phần tử đó xuất hiện trong mảng, ví dụ nếu đầu vào là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', ...
7Sau đó không xuất hiện 6 lần và một lần 3 lần
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', ...
8Bạn nên nhận được:
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', ...
9Đã trả lời ngày 15 tháng 11 năm 2020 lúc 13:26Nov 15, 2020 at 13:26
AenaonaenaonAenaon
2.9094 Huy hiệu vàng28 Huy hiệu bạc56 Huy hiệu Đồng4 gold badges28 silver badges56 bronze badges
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', ...
0Đã trả lời ngày 9 tháng 7 năm 2021 lúc 14:47Jul 9, 2021 at 14:47
1
Lưu trữ tất cả các đối số của bạn như một mảng các bộ dữ liệu.
Ví dụ nói rằng bạn thường gọi chức năng của mình là:
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', ...
1Thay vào đó hãy vượt qua một tuple và giải nén các đối số:
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', ...
2Xây dựng bộ tuple bằng cách sử dụng một vòng lặp trước:
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', ...
3Sau đó thực thi tất cả bằng cách sử dụng bản đồ bằng cách chuyển mảng của bộ dữ liệu:
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', ...
4Tôi biết Python có
[3, 5, 7]
6 và [3, 5, 7]
7 để giải nén, nhưng tôi chưa thử chúng.Cũng tốt hơn để sử dụng tương lai đồng thời thư viện cấp cao hơn so với thư viện đa xử lý cấp thấp.
Đã trả lời ngày 19 tháng 6 năm 2021 lúc 15:16Jun 19, 2021 at 15:16
Đối với Python & nbsp; 2, bạn có thể sử dụng thủ thuật 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', ...
5
Đã trả lời ngày 18 tháng 5 năm 2018 lúc 4:06May 18, 2018 at 4:06
Hz Thượng Hải ThươngHz Shang
Huy hiệu đồng 951 Bạc8 Huy hiệu Đồng1 silver badge8 bronze badges
1