2

Windows で実行可能ファイルを実行し、テキスト出力ファイルを複数のスレッド プロセスを使用するバージョンに管理する Python スクリプトをアップグレードして、複数のコアを利用できるようにしようとしています。各スレッドがアクセスすることを認識している実行可能ファイルの 4 つの個別のバージョンがあります。この部分は正常に動作します。私が問題に遭遇するのは、それらが同時に実行されていて、(異なる) 出力ファイルを開こうとして、それらが正しく実行され、出力ファイルの内容に応じて反応することを確認する場合です。

具体的には、3 つのスレッドを実行すると、2 つのスレッドが次のエラーでクラッシュし、1 つのスレッドは引き続き動作します。

Exception in thread Thread-4:
Traceback (most recent call last):
  File "C:\Python27\lib\threading.py", line 552, in __bootstrap_inner
    self.run()
  File "E:\HDA\HDA-1.0.1\Hm-1.0.1.py", line 782, in run
    conf = self.conf_file(Run)
  File "E:\HDA\HDA-1.0.1\Hm-1.0.1.py", line 729, in conf_file
    l = open(self.run_dir(Run)+Run, 'r').readlines()     #list of file lines
IOError: [Errno 2] No such file or directory: 'Path/to/Outputfile'

これは、スレッドが実行可能ファイルを正しく実行していないことが原因です (つまり、'Path/to/Outputfile' が作成されず、見つからないためです)。しかし、スレッドの 1 つはこれを正しく行いますが、他の 2 つはできません。異なるバージョンの実行可能ファイルを実行する複数のスレッドを取得できない理由はありますか?

4

2 に答える 2

2

Global Interpreter Lockのため、Python は現在複数のコアを利用できません。とにかく、マルチスレッド化には問題がつきものです。可能であれば、複数のプロセスを使用することをお勧めします。

于 2012-04-25T02:04:39.133 に答える
2

ファイルを開いて奇妙なデッドロックまたはスピンロック状態に陥らない限り、GIL だけでこれを強制終了することはないと思います。 一般に、このような I/O バウンドの場合はスレッドが必要です。実際、複数のスレッドが同時に実行できるという事実は、ファイルを数回正常に開くのではなく、他のスレッドが失敗する原因となる可能性があります。

このプレゼンテーションのスライド 15 で、著者は、GIL が I/O 呼び出しのブロックを解除して、他のスレッドにチャンスを与えることを指摘しています。

ここでの本当の問題は、ファイル リソースのロックにあるようです。Windows がどのように機能するのかよくわからないので、このエラーが忍び寄る理由について話すことはできませんが、ファイル リソースを実際にロックしているのは 1 つのスレッドだけのようです。

複数のコアと GIL に関する他のポスターのポイントは、他の 2 つのスレッドが不足している場所である種の優先順位の逆転が発生する可能性があるという点で、機能し始めている可能性がありますが、上記のプレゼンテーションでスレッドがブロッキング操作の途中で、他のスレッドのロックを解放します。

1つの考えは試してみることmultiprocessingです。スレッドではなく、複数のプロセスでファイルを読み取る方がうまくいくと思います。

testこれは、私が書いてOS 10.7.3マシンで試した例です。内容がlol\n次のファイルが開きます。

import multiprocessing
import os

def open_file(x):
   with open(x, 'r') as file_obj:
     return file_obj.readlines()

a = multiprocessing.Pool(4)
print a.map(open_file, ['test']*4)

これを実行したときの結果は次のとおりです。

➜  ~ git:(master) ✗ python open_test.py
[['lol\n'], ['lol\n'], ['lol\n'], ['lol\n']]
于 2012-04-25T05:57:21.333 に答える