4

Cで実装された特定のPython関数(file.read()が含まれていると思います)は、動作中にGILを解放し、完了時に元に戻すことができることを読みました。そうすることで、複数のコアを利用できます。再利用可能。

マルチプロセスを使用してコードを並列化しています。現在、親、ファイルからデータを読み取る子、最初の子プロセスから渡されたデータからチェックサムを生成する子の3つのプロセスがあります。

この権利を理解していれば、現在行っているようにファイルを読み取るための新しいプロセスを作成する必要はないようです。メインプロセスで呼び出す必要があります。問題は、私がこの権利を理解しているかどうか、そして読み取りをメインプロセスまたは別のプロセスに保持することでパフォーマンスが向上するかどうかです。

したがって、処理するデータを読み取ってパイプ処理する関数を指定すると、次のようになります。

def read(file_path, pipe_out):
    with open(file_path, 'rb') as file_:
        while True:
            block = file_.read(block_size)
            if not block:
                break
            pipe_out.send(block)
    pipe_out.close()

これは間違いなく複数のコアを利用すると思いますが、オーバーヘッドも発生します。

multiprocess.Process(target=read, args).start()

しかし今、これを行うだけで、オーバーヘッドを除いた複数のコアも使用されるのではないかと思います。

read(*args)

どちらがより速く、どのような理由で誰もが持っている洞察は大いにありがたいです!

4

2 に答える 2

2

これがあなたの質問の主要部分だと思います:

問題は、私がこの権利を理解しているかどうか、そして読み取りをメインプロセスまたは別のプロセスに保持することでパフォーマンスが向上するかどうかです。

私はあなたの目標がファイルをできるだけ速く読んで処理することだと思います。いずれの場合も、ファイルの読み取りはI / Oバウンドであり、CPUバウンドではありません。データを読み取ることができるよりも速くデータを処理することはできません。したがって、ファイルI / Oは、ソフトウェアのパフォーマンスを明らかに制限します。ファイルの読み取りに同時スレッド/プロセスを使用して、読み取りデータレートを上げることはできません。また、「低レベル」のCPythonはこれを実行していません。1つのプロセスまたはスレッドでファイルを読み取る限り(GILを使用するCPythonの場合でも、スレッドは問題ありません)、ストレージデバイスから取得できるのと同じ量のデータを1回あたりに取得できます。また、実際にファイルの読み取りを遅くする他のブロッキング呼び出しがない限り、メインスレッドでファイルの読み取りを行うこともできます。

于 2012-08-31T11:41:24.233 に答える
1

さて、コメントから出てきたように、実際の質問は次のとおりです。

Does (C)Python create threads on its own, and if so, how can I make use of that?

簡単な答え:いいえ。

しかし、それでもこれらのC関数がPythonプログラマーにとって興味深い理由は、次のとおりです。デフォルトでは、同じインタープリターで実行されているPythonコードの2つのスニペットを並行して実行することはできません。これは、グローバルインタープリターロック(別名GIL)と呼ばれる悪が原因です。GILは、インタープリターがPythonコードを実行しているときは常に保持されます。これは、同じインタープリターで2つのPythonコードを並行して実行することはできないという上記のステートメントを意味します。

それでも、Pythonでマルチスレッドを利用することはできます。つまり、多くのI / Oを実行している場合や、numpy、scipy、lxmlなどの外部ライブラリを多く利用している場合です。可能な場合はいつでも(つまり、Pythonインタープリターと対話する必要がない場合はいつでも)GILを解放します。

それで問題が少し解決したことを願っています。

于 2012-08-31T11:28:43.213 に答える