2011-01-28 8 views
32

Tôi đã hàm sau:Làm thế nào để cho Pool.map mất một hàm lambda

def copy_file(source_file, target_dir): 
    pass 

Bây giờ tôi muốn sử dụng multiprocessing để thực hiện chức năng này cùng một lúc:

p = Pool(12) 
p.map(lambda x: copy_file(x,target_dir), file_list) 

Vấn đề là , lambda không thể được ngâm, vì vậy điều này không thành công. Cách gọn gàng nhất (pythonic) để sửa lỗi này là gì?

Trả lời

45

Sử dụng một đối tượng hàm:

class Copier(object): 
    def __init__(self, tgtdir): 
     self.target_dir = tgtdir 
    def __call__(self, src): 
     copy_file(src, self.target_dir) 

Để chạy Pool.map của bạn:

p.map(Copier(target_dir), file_list) 
+2

Cảm ơn, đây thực sự là những gì tôi cần ! –

+1

Cảm ơn! Tôi thực sự mong họ có thể tham gia vào chức năng lambda! – yeelan

15

Câu trả lời dưới đây được rút vì does not actually work này trong python2 từ functools.partial đối tượng (trong python2) không picklable. Tuy nhiên, các đối tượng

functools.partial đã được tạo thành trong Python3, vì vậy giải pháp này không hoạt động ở đó.


Bạn có thể sử dụng functools.partial:

import functools 
copier=functools.partial(copy_file,target_dir=target_dir) 
p.map(copier,file_list) 

+0

Điều này thậm chí trông sạch hơn ... Tôi sẽ quyết định sau đó một trong những để làm cho câu trả lời của tôi –

+0

@Peter Smit: Rất tiếc - bạn đã thấy bài đăng của tôi trước khi tôi xóa nó ... Tôi đang xóa thông báo này chỉ để thông báo nó không làm việc do lỗi trong Python2. – unutbu

+0

Ah, ok. Tôi đang tìm kiếm tài liệu và không thấy nhận xét về khả năng lựa chọn, vì vậy tôi cho rằng họ ... Tôi sẽ chấp nhận câu trả lời khác, vì đó dường như là cách để đi. –

0

Câu hỏi là một chút cũ nhưng nếu bạn vẫn đang sử dụng Python 2 câu trả lời của tôi có thể có ích.

Thủ thuật là sử dụng một phần của dự án pathos: multiprocess ngã ba đa xử lý. Nó thoát khỏi giới hạn gây phiền nhiễu của đa xử lý ban đầu.

Cài đặt: pip install multiprocess

Cách sử dụng:

>>> from multiprocess import Pool 
>>> p = Pool(4) 
>>> print p.map(lambda x: (lambda y:y**2)(x) + x, xrange(10)) 
[0, 2, 6, 12, 20, 30, 42, 56, 72, 90] 
0

Từ this câu trả lời, pathos cho phép của bạn chạy lambda của bạn p.map(lambda x: copy_file(x,target_dir), file_list) trực tiếp, tiết kiệm tất cả các cách giải quyết/hacks