Pythonの35日目:デーモン/プロセス/ IPCプロセス間通信/キューのキュー/生産者 - 消費者モデルとの間の相互ミューテックス

#デーモン

`` `Pythonの
DEFタスク(名=なし、年齢= なし):
     印刷" デーモンとして子プロセス" 
    time.sleep( 5 印刷" 最後の守護者" 、名前、年齢)
 IF  __name__ = = " __main__ " 印刷" 親プロセスの開始" 
    のp- =プロセス(対象=タスク、kwargsから= { " "" オーウェン"" 年齢":18 })
    #は、デーモンがスタートする前に設定する必要がありますセットアップ
    #1 p.daemon =真
    p.start()
    time.sleep( 2 印刷親プロセスの終了
    p.terminate()
" p.terminate()の終了を強制しますこのプロセスは、クリーンアップしません:pは子プロセスがpが持っている場合、ロックは特に注意して、デッドロックになるだろう孤立になります持っている!!! 
#のデーモン:親プロセスを終了する子プロセスの守護親プロセス、子プロセスが実行されていません最後は終了している。

`` ` 

リソースの競合同時#/データセキュリティの問題やミューテックスによって引き起こさ

` `` Pythonの
複数のプロセスがリソースで動作するデータ化けになりながら問題
からマルチプロセッシングインポートプロセスを、ロック
 のインポート時、ランダム

DEF タスク(ロック):
    ロックされたが、本質はすべてロックされたプロセス、同協定のラベル付けを与えることです。
    lock.acquire()
    印刷" こんにちは、私はジェリーだ" 
    time.sleep(random.randint(0、 1 ))
     プリント" 年齢が18である" 
    lock.release()
デフタスク2(ロック):
    lock.acquire()
    印刷" こんにちは私はオーウェンだ" 
    time.sleep(random.randint(0、 1 ))
     プリント" 年齢が19である" 
    lock.release()
の場合 __name__ == " __main__ " 
    ロック =ロック()
    P1 =プロセス(対象=タスク、引数= (ロック))
    P2 =プロセス(対象=タスク2、引数= (ロック))
    p1.start()
    p2.start() 
、同じ実行時にロックをかけることができません実行することはできません繰り返し取得、するためにつながるフォローロックロック一度会う!リリースしなければならない時間の取得を
#の性質はまた、同時施行シリアル実行にロックされます。同様に、後にstartメソッドを持つメソッドに参加する。
「」」の違いその:1.joinは、固定された実行順序である親プロセスが子を待ち原因となります
親が他の事を行うことができますが、まだ実行され、誰でもつかむべきで公正な競争であるロック
参加のプロセスです:主な違い2.しますすべてのシリアルタスク、ロックがコードの任意の行にロックすることができる、独自のサイズを調整することができ「」 "。 
3 ミューテックスサイズ:大きなコードロックのサイズは、より多くの効率を意味低い
              より小さい粒径を意味するロック効率は、以下のコードより高い

` 

#1 #プロセス間通信IPC 

`のPython 
からマルチプロセッシングインポートプロセス、マネージャー、ロック
 インポート時間
 DEF タスク(データ、L、I):
    l.acquire()
    印刷(I) =データ[ " 名前" ] 
    time.sleep( 0.1) すべての読み取りプロセスを引き起こし遅延、ある"オーウェン" 
    データ[ " 名前" ] =名前は+ " です" 
    印刷(I)
    l.release()

IF  __name__ == " __main__ " 共有辞書マネージャ開いてみましょう 
    メートルを= マネージャ()
    データ =メートル.dict({ " 名前"" オーウェン" })
    L =ロック() ロックオブジェクト
    について I におけるレンジ(9 ):
        P =プロセス(目標=タスク、引数= (データ、L、I))
        p.start()
    time.sleep ( 2 印刷(データ)
 #1 Managerは、パッケージング方法をロックしていない、彼らのシェア.Managerオープンスペースを増やす必要があり、親プロセスで
#のエンドメモリ親プロセス、子プロセスが与えられ、終わっていません:パイプがクローズされるデータコンテナdictを、リスト、キュー。3つのタイプの下にManagerオブジェクト

`` ` 

#1 #キューキュー

` ``パイソン
からマルチプロセッシングインポートキュー

Q =キューを(3)キューを作成し、あなたは数に制限はありません、MAXSIZEを指定していない

#の記憶素子 
q.put(" A " 
q.put(" B " 
q.put(" cは" 1 @:印刷( "このステップを実行します。" )
を印刷(q.get()) 2 @このステップ:! @の償却、 
q.put(D 容量がいっぱいになった場合、ブロッキングステートに置くために呼び出し時に、
          から誰かまでデータキューは取るしていきます
#を@ 2:印刷( "このステップは実行されません")
を印刷(q.get())
 を印刷(q.get())
 を印刷(q.get())
 印刷(Qを.get()) あなたがブロックさに入るために呼び出すとき、キューが空の場合、
              誰かが新しいデータから継続するまでキューに保存されている
印刷`` down`実行していない
q.put(E ブロックは、ブロックがブロックされ、デフォルトであるかどうかを示す設定し、キューが空Falseのときに例外がスローされたとき 
q.get(ブロック= Trueの場合、タイムアウト= 2 #1 ブロックは、ブロックがデフォルトのブロックされているかどうかを示す
#をFalseにし、キューに設定した場合完全なときに例外がスローされた
#1 q.putは(「123」は、ブロック=偽、) タイムアウトがブロックに真のみ有効にスローされるブロッキングタイムアウト、または時間や位置やない例外オーバーなしの値を表します

`` ` 

#1 #プロデューサー、コンシューマーモデル

`` `Pythonの
インポート時、ランダム
 からマルチプロセッシングインポートプロセスを、キュー

DEF消費(Q): 消費者
    のための I におけるレンジ(10 ):
        データ = q.get()
        time.sleep(random.randint(0,1))
        を印刷(データは、" %sのデータの消費"%のI)
 DEFのプロデューサー(Q):#1 メーカー
    のための I における   範囲(10 ):
        time.sleep( 1 
        データ = " %Sの生産データ"Iは
        q.put(データ)

IF  __name__ == " __main__" 
    Q = キュー()
    Consu =プロセス(目標=消費し、引数= (Q))
    のProd =プロセス(目標=プロデューサー、引数= (Q))
    consu.start()
    prod.start() 
親でキュー・キュー・プロセスは、容器を開け、子コンテナは、get / PUTメソッドを介してアクセスし、ない相互に排他的なことができます。直前に入った後、キュー記憶/アクセス順序は、最初のうちで最初のものです生産/消費モデルは、メモリを基本的に開いています共有メモリ空間の間で、書き込み内容の内部で、そこにコンテンツを取ります。

`` `

 

おすすめ

転載: www.cnblogs.com/huhongpeng/p/10969354.html