Python multiprocessingスレッドプールの少しの体得
2512 ワード
問題の背景:
マルチスレッド、マルチプロセスは、プログラムの実行効率を向上させるためによく使用される方法です.pythonのmultiprocessingパッケージはマルチプロセスをサポートします.
下には単純なマルチプロセスdemoがあります.
このdemoでは、まず「test」を印刷し、4つのプロセスを収容するプロセスプールを作成し、プロセスプール呼び出しプロセスにより10サイクルを完了することが望ましい.しかし、実際の実行結果は次のようになります(「,」:
ここでprint(「test」)が5回実行されたのは明らかに私たちが望んでいた結果ではないが、なぜだろうか.
分析:
分析を容易にするために、一部のコードを以下のように変更します.
パッケージosを導入し、プロセス番号を2箇所印刷し、「_main_」で1回モジュール外、一度に「_main_」モジュール内結果は次のとおりです.
上記の結果から,「_main_」モジュール内のgetpid()は1回実行され、このモジュール外のgetpid()は5回実行され、そのうちpid値が「_main_」内のgetpid()は同じです.
プロセスの基本概念から,プロセスが主(親)プロセス,サブプロセスに分かれていることが分かった.私たちがtestを実行するとpyの場合、実行されるプロセスはメインプロセスで、最初のtest、getpid()--main outが印刷されます.メインプロセスの_name__値は「_main_」です.そこで「_main_」を実行モジュールは、getpid()--main inを印刷し、multicore()メソッドの呼び出しを開始する.
このときスレッドは4つのプロセスを収容できるプロセスプールを作成し、プロセスプールは新しいプロセスを追加するたびにpyファイル全体をスキャンし、
実行するので、他の4つのtestとpid-main outが表示されます.
これで分析全体がほぼ終わり、サブプロセスがスキャンされたときもスキャンされたと聞くかもしれません.
なぜ実行しないのですか?
これは、サブプロセスの"_name_"値が「_main_」に等しくない場合、印刷してみてもいいです
締めくくり:
分析の過程全体がそうです簡単に言えば、プロセスプールはpyファイルのすべての実行可能な文を実行するサブプロセスを作成します.そのため、サブプロセスが実行する文を関数内に置くか、
文の下
参考文献:
Pythonのif_を簡単に理解する方法name__ == '__main__'
マルチスレッド、マルチプロセスは、プログラムの実行効率を向上させるためによく使用される方法です.pythonのmultiprocessingパッケージはマルチプロセスをサポートします.
下には単純なマルチプロセスdemoがあります.
from multiprocessing import Pool
def f(x): # x
return x * x
def my_callback(x): # , x
print(x)
def multicore():
pool = Pool(4) #
for i in range(10): # f, , 10
pool.apply_async(f, args=(i,), callback=my_callback)
pool.close() # ,
pool.join() #
print("test")
if __name__ == '__main__': #
multicore()
このdemoでは、まず「test」を印刷し、4つのプロセスを収容するプロセスプールを作成し、プロセスプール呼び出しプロセスにより10サイクルを完了することが望ましい.しかし、実際の実行結果は次のようになります(「,」:
test,test,test,0,1,4,9,16,25,36,49,64,81,test,test
ここでprint(「test」)が5回実行されたのは明らかに私たちが望んでいた結果ではないが、なぜだろうか.
分析:
分析を容易にするために、一部のコードを以下のように変更します.
print("test")
print("%d-------- main out" % os.getpid())
if __name__ == '__main__': #
print("%d-------- main in" % os.getpid())
multicore()
パッケージosを導入し、プロセス番号を2箇所印刷し、「_main_」で1回モジュール外、一度に「_main_」モジュール内結果は次のとおりです.
test
4072-------- main out
4072-------- main in
test
8248-------- main out
test
11932-------- main out
0
1
4
9
16
25
36
49
64
81
test
4892-------- main out
test
4060-------- main out
上記の結果から,「_main_」モジュール内のgetpid()は1回実行され、このモジュール外のgetpid()は5回実行され、そのうちpid値が「_main_」内のgetpid()は同じです.
プロセスの基本概念から,プロセスが主(親)プロセス,サブプロセスに分かれていることが分かった.私たちがtestを実行するとpyの場合、実行されるプロセスはメインプロセスで、最初のtest、getpid()--main outが印刷されます.メインプロセスの_name__値は「_main_」です.そこで「_main_」を実行モジュールは、getpid()--main inを印刷し、multicore()メソッドの呼び出しを開始する.
このときスレッドは4つのプロセスを収容できるプロセスプールを作成し、プロセスプールは新しいプロセスを追加するたびにpyファイル全体をスキャンし、
print("test")
print("%d-------- main out" % os.getpid())
実行するので、他の4つのtestとpid-main outが表示されます.
これで分析全体がほぼ終わり、サブプロセスがスキャンされたときもスキャンされたと聞くかもしれません.
if __name__ == '__main__': #
print("%d-------- main in" % os.getpid())
multicore()
なぜ実行しないのですか?
これは、サブプロセスの"_name_"値が「_main_」に等しくない場合、印刷してみてもいいです
print(__name__)
締めくくり:
分析の過程全体がそうです簡単に言えば、プロセスプールはpyファイルのすべての実行可能な文を実行するサブプロセスを作成します.そのため、サブプロセスが実行する文を関数内に置くか、
if __name__ == '__main__': #
文の下
参考文献:
Pythonのif_を簡単に理解する方法name__ == '__main__'