2009-11-09 43 views
52

Tôi đang tìm kiếm một bản đồ song song dựa trên quá trình đơn giản cho trăn, có nghĩa là, một chức năngCó một bản đồ song song dựa trên quá trình đơn giản cho python không?

parmap(function,[data]) 

mà có thể chạy chức năng trên mỗi phần tử của [dữ liệu] trên một quá trình khác nhau (tốt, trên một khác nhau cốt lõi, nhưng AFAIK, cách duy nhất để chạy các công cụ trên các lõi khác nhau trong python là bắt đầu nhiều phiên dịch), và trả về một danh sách các kết quả.

Có điều gì như thế này không? Tôi muốn một cái gì đó đơn giản, do đó, một mô-đun đơn giản sẽ được tốt đẹp. Tất nhiên, nếu không có những điều như vậy tồn tại, tôi sẽ giải quyết cho một thư viện lớn: -/

Trả lời

93

tôi có vẻ như những gì bạn cần là map method in multiprocessing.Pool():

map(func, iterable[, chunksize])

A parallel equivalent of the map() built-in function (it supports only 
one iterable argument though). It blocks till the result is ready. 

This method chops the iterable into a number of chunks which it submits to the 
process pool as separate tasks. The (approximate) size of these chunks can be 
specified by setting chunksize to a positive integ 

Ví dụ, nếu bạn muốn để lập bản đồ chức năng này :

def f(x): 
    return x**2 

để dao động (10), bạn có thể làm điều đó bằng cách sử dụng built-in bản đồ() chức năng:

map(f, range(10)) 

hoặc sử dụng bản đồ phương thức multiprocessing.Poll() của đối tượng():

import multiprocessing 
pool = multiprocessing.Pool() 
print pool.map(f, range(10)) 
+0

Cảm ơn rất nhiều câu trả lời chi tiết của bạn! –

+4

Nếu bạn đang gọi điều này từ một chương trình tồn tại lâu dài, hãy chắc chắn gọi 'pool.close' (lý tưởng trong khối' finally' của một 'try/finally' kèm theo). Nếu không, các hồ bơi có thể không làm sạch các quá trình con và bạn có thể kết thúc với các quá trình zombie. Xem http://bugs.python.org/issue19675 – rogueleaderr

+2

@rogueleaderr Sẽ không thành ngữ hơn khi sử dụng 'with'? – CodeMonkey

Các vấn đề liên quan