pythonマルチプロセスファイル操作のいくつかの理解

1537 ワード

マルチプロセスが同じファイルに書き込まれると、複数のプロセスがリソースを争う問題が発生します.書き込まれたファイルの内容が錯乱します.1.ファイルへの書き込み:同じ時間に、ファイルへの書き込み操作を行うプロセスは1つしかありません.これはオペレーティングシステムの設定2である.≪マルチプロセス・ライト・ファイル|Multi Process Write File|emdw≫:オペレーティング・システムによって、どのプロセスがオペレーションに書き込まれるかがランダムに決定されます.この決定はランダムで,完全に無秩序であるからである.そのため、ファイルを書き込むと、ファイルの順序が狂うことがあります.1つのプロセスがどのくらい実行されるかは、オペレーティングシステムによって決まります.また、プログラムの実行ユニットは原子型であり、つまり1行のアセンブリコードこそ実行ユニットであり、Pythonの1行のコードではなく実行ユニットである.
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   。