2016-05-11 6 views
0

プールにジョブを1つずつ送信しようとしています(メモリの制限により、マップを使用できません)。利用可能な労働者がいなければプールを消化することができますか?例: このようなことはできますか? p = Pool(n_workers) for item in list: p.work_on_this(item) work_on_thisは、プールに使用可能なワーカーがさらにある場合はジョブを送信し、それ以外の場合は待機します。マルチプロセッシングpythonは、プールにジョブを順次送信することが可能です

+0

http://stackoverflow.com/questions/17909132/python-multiprocessing-set-spawning-process-to-waitと似たようなものがあります。これで私はいくつかのロジックを構築できると思います。 – pmaniyan

+1

'map'は使えませんか? 'chunksize = 1'を設定すると、ジョブが1つずつ送られます。 – tdelaney

+1

'map'ではなく' imap'をどうですか? – tjollans

答えて

0

問題の解決方法は、作業者の数で初期化されたセマフォを使用することです。プールに入る前と作業を完了した後で、セマフォを取得して解放します。

ここでは、Python 2.6以上で動作する例を示します。

from threading import Semaphore 
from multiprocessing import Pool 


def TaskManager: 
    def __init__(self, processes): 
     self.pool = Pool(processes=processes) 
     self.workers = Semaphore(processes) 

    def new_task(self): 
     """Start a new task, block if all workers are busy.""" 
     self.workers.acquire() 
     self.pool.apply_async(function, callback=self.task_done) 

    def task_done(self, results): 
     """Called once task is done, releases the caller if blocked.""" 
     self.workers.release() 
関連する問題