pythonマルチプロセスファイル操作のいくつかの理解
1537 ワード
マルチプロセスが同じファイルに書き込まれると、複数のプロセスがリソースを争う問題が発生します.書き込まれたファイルの内容が錯乱します.1.ファイルへの書き込み:同じ時間に、ファイルへの書き込み操作を行うプロセスは1つしかありません.これはオペレーティングシステムの設定2である.≪マルチプロセス・ライト・ファイル|Multi Process Write File|emdw≫:オペレーティング・システムによって、どのプロセスがオペレーションに書き込まれるかがランダムに決定されます.この決定はランダムで,完全に無秩序であるからである.そのため、ファイルを書き込むと、ファイルの順序が狂うことがあります.1つのプロセスがどのくらい実行されるかは、オペレーティングシステムによって決まります.また、プログラムの実行ユニットは原子型であり、つまり1行のアセンブリコードこそ実行ユニットであり、Pythonの1行のコードではなく実行ユニットである.
解決方法:1.書き込み操作にロックをかけるということは、現在書き込み操作を行っているプロセスをロックし、そのプロセスが10文字、すなわち完了した操作を書き終わるまで、プロセスのロックを解除して離れます.別のプロセスに切り替えて操作します.切り替えを許可するには、1回に1つのプロセスのみが書き込み操作を実行でき、完全な操作を完了する必要があるためです.だから書類の内容が混乱することはありません.しかし、ロックが完了すると、プログラムの実行効率が低下するのが一般的です.また、書き込み操作がコード全体に分散していると、コード全体をロックすることはできないのではないでしょうか.これでまた単一のプロセスになるのではないでしょうか.したがって,書き込み操作を単独の関数として抽象化し,単独の関数にクラスタを加えると問題は大きくない.より優雅な方法:multiprocessingのコールバック関数を使用します.1.書き込み操作を個別の関数2として抽象化する.プロセスに書き込む必要がある内容を,戻り値として3を返す.コールバック関数を使用して、プロセスが返す内容を書き込みます.
3. : 。
: , , 。 。
, , 。
1 , 3 。 3 , 5, 。
。 1 , 3 , 5 。
解決方法:1.書き込み操作にロックをかけるということは、現在書き込み操作を行っているプロセスをロックし、そのプロセスが10文字、すなわち完了した操作を書き終わるまで、プロセスのロックを解除して離れます.別のプロセスに切り替えて操作します.切り替えを許可するには、1回に1つのプロセスのみが書き込み操作を実行でき、完全な操作を完了する必要があるためです.だから書類の内容が混乱することはありません.しかし、ロックが完了すると、プログラムの実行効率が低下するのが一般的です.また、書き込み操作がコード全体に分散していると、コード全体をロックすることはできないのではないでしょうか.これでまた単一のプロセスになるのではないでしょうか.したがって,書き込み操作を単独の関数として抽象化し,単独の関数にクラスタを加えると問題は大きくない.より優雅な方法:multiprocessingのコールバック関数を使用します.1.書き込み操作を個別の関数2として抽象化する.プロセスに書き込む必要がある内容を,戻り値として3を返す.コールバック関数を使用して、プロセスが返す内容を書き込みます.
def myCallBack(x):
, x
def getInfo(num):
return num
pool = multiprocessing.Pool()
for i in range(10):
pool.apply_async(getInfo,(i,),callback=myCallBack)
pool.close()
pool.join()
apply_async , python apply 。 。
close() pool,
join() , join close 。