2011-02-13 14 views
2

私はいくつかのディレクトリ内のファイルを巡回し、スレッドを開始し、ファイルに対して何かを行うスクリプトを作成しました。これらは時間がかかり、高価な操作であるため、私はそれを実行しているマシン上で見つかったCPUの数より1つ少ない数にスレッドの数を制限しました。次に、アクティブなスレッドの数が常にチェックされ、空き容量がある場合は別のスレッドが開始されます。マシン上のCPUの数を返す関数については、thisを使用しました。Pythonのスレッドを制限する正規/標準的な方法

ncpus = detectCPUs() 

for (dirpath, dirnames, filenames) in os.walk(path_to_root): 
    for filename in filenames: 
     while True: 
      if threading.activeCount() < ncpus - 1: 
       MyThread(dirpath, filename).start() 
       break 
      else: 
       time.sleep(100) 

私は自動的に私がスレッドとCPUの数のタブを維持することなく、私のためにこれを行うだろうthreadingライブラリの関数や他の場所pythonでがあることを感じを脱出することはできません。誰にも分かるだろうか?あるいは、熟練した退役軍人がそれをする方法を指摘していますか?

いくつかの制限があります。私が使用している共有マシンには、Python 2.5がインストールされているだけで、インストールにはroot特権がありません。ですから、multiprocessingまたはPython 2.6以上を必要とする素敵なライブラリは問題になりません。

+0

スレッドプールのようなものは私の心に来て、あなたのスレッドジョブを積み重ね、古いものがバッチ処理されるようになるかもしれません...しかし、私は答えが分かりません。 – progo

答えて

2

おそらく、スレッドプールの実装がここで必要なのでしょうか?

http://code.activestate.com/recipes/577187/

それはそのようなことになります。あなたは、Pythonをアップグレードすることはできません場合でも、あなたはまだマルチプロセッシングを使用することができます

pool = ThreadPool(num_threads) 
for obj in objects: 
    pool.add_task(obj.do_stuff, [arg1, arg2]) 
pool.wait_completion()  
+0

知っておくと便利だと投票しました。残念ながら、私の今のものよりも、それはもはや「標準的」ではありません。 – JasonMond

+0

スレッドプールは、プログラミングにおいてかなり標準的なパターンです。 (http://en.wikipedia.org/wiki/Thread_pool_pattern)Pythonで組み込みの実装がない場合、それを悪いものにすることはありません。 – Spajus

2

を。

multiprocessingは、Python 2.6/3.0 multiprocessingパッケージのバックポートです。 [...]このスタンドアロンの亜種は、Python 2.4と2.5と互換性があることを意図しており、python-trunkから修正/改善を引き出す予定です。

ただローカルライブラリとしてインストールしてください。

他にもいくつかの「ワーカー/スレッドプール」ライブラリがありますが、実際には少なくともマルチプロセスまたはサブプロセスを使用したいと考えています。 PythonのGILは、「スレッド」が1つのCPU上でお互いをブロックし、スループットを低下させ、プロセスがシングルスレッドの場合(特にI/Oが関わっている場合)より遅くなることを意味します。

+0

後方互換性があるかどうかはわかりませんでした。情報をありがとう!有益であると投票した – JasonMond

0

標準のPythonを使用している場合、スレッドの有用性には限界があります。 Canonical Pythonは、グローバルインタプリタロック(GIL)を使用します。このインタプリタロックでは、一度に1つのPythonスレッドしか実行できません。

あなたのファイル操作が長時間にわたってブロックされている場合や、GILをリリースするCで書かれたPythonライブラリを使用している場合、スレッドが役立ちます。

私は、GILを回避できるように、マルチプロセッシングを検討することを強くお勧めします。

関連する問題