0

このトピックに関するいくつかの質問がありましたが、私の質問に対する答えが見つかりませんでした。python docs でさえ、それほど説明的ではありません。

私の問題は単純です。巨大なリストを断片に分割し、各断片を並行して処理したいのです。

したがって、私の質問は、インタープリターがプログラムの下流行を開始する前にすべてのスレッドが終了するまで待機するか (私の場合は処理済みリストの統合)、または下流プロセスを別のスレッドとして定義して使用する必要があるかどうかですjoin

ただし、トピックに関する投稿 ( Thread vs. Threadingthread ) を読みましたが、との違いはまだよくわかりませんでしたthreading

このトピックに関する適切なテキストを教えてください。ドキュメントはあまり有益ではありません。

PS (@zzk) では、マルチプロセッシングを使用しても、すべてのプロセスが終了した後に共通のコードを実行するにはどうすればよいですか? たとえば、5 つのプロセスで 5 つのリストが生成されます。そして今、これらのリストをマージし、並べ替えて、ファイルに書き込む必要があります。

[コードは正確ではなく、状況を説明するためのものです]

def fun(x,y):
    y=someprocessing(x) #type(y)=List

if __name__ == '__main__':
    for i in listofprocesses:
        p = Process(target=fun, args=(i,y))
        p.start()

# DOWNSTREAM CODE#
yy=y1+y2+y3+y4+y5; 
yy.sort()
for j in yy:
    outfile.write(j)

y異なる工程で生産されたものを組み合わせてマージしたい。ここで 2 つの疑問があります。

  1. 変数名が同じなので、出力リスト( y)を引数として渡す必要がありますか?

  2. そう仮定すると、処理されたすべてのリストがy1,y2,y3,y4&として保存されy5、下流のコードが実行されます。すべてのプロセスが終了したことを確認する方法は?

4

1 に答える 1

1

GILが原因で、スレッド化またはスレッド化は役に立ちません。

CPythonでは、グローバルインタープリターロック(GIL)は、複数のネイティブスレッドがPythonバイトコードを一度に実行するのを防ぐミューテックスです。このロックが必要なのは、主にCPythonのメモリ管理がスレッドセーフではないためです。

マルチプロセッシングが必要になる場合があります

于 2013-03-11T20:15:33.037 に答える