2016-08-10 9 views
0

リクエストタイプのオブジェクトのリストを取り込み、リクエスト(オブジェクトの.execute()APIを使用)を実行してリクエストの結果を返すことのできるクラスを作成中です。私はこれを複数処理させようとするときに問題にぶつかっています。私は過去にプールを使用していましたが、ここで働くのに苦労しています。プールからExecutorクラスの静的メソッドを実行しようとすると、私はPicklingErrorを受け取ります。しかし、新しいProcessオブジェクトから直接実行すると、期待どおりに動作するように見えます。この現象の原因は何ですか?私がここで間違ってやっていることは明らかですか?これをPython 2.6で実行するとbtwマルチプロセッシングプールPicklingError

ありがとう!

執行クラス:

class Executor(object): 
    def __init__(self, max_threads): 
     self.max_threads = max_threads 

    @staticmethod 
    def execute_request_partition(requests): 
     return [request.execute() for request in requests] 

    def execute_requests(self, list_of_requests): 
     partitions = split_list(list_of_requests, self.max_threads) 
     # Seems to execute as expected 
     process = Process(target=self.execute_request_partition, args=(partitions[0],)) 
     process.run() 

     # PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed 
     p = Pool(1) 
     p.apply_async(self.execute_request_partition, args=(partitions[0],)) 
     p.close() 
     p.join() 
+0

'multiprocessing'の代わりに' multiprocess'を使うと時間と神経を大いに節約できます。 –

答えて

1

これは、あなたが持つ問題を説明する必要があります:サイドノートでCan't pickle static method - Multiprocessing - Python

:私は私の時間の大半を過ごすことするつもりならば、私はマルチプロセッシング使用することはありませんIOを待っている。スレッドやコルーチン(http://www.gevent.org/)を試してみてください。あなたは同じ性能を得るでしょう酸洗いで大騒ぎはありません

関連する問題