生産者と消費者のデーモンミューテックスPICモデル

1つのデーモン

  定義:デーモンプロセスが別のプロセスのかもしれ
  例えば:bがデーモンである場合には、デーモンプロセスで、完成し、bはまた、風水が終了しますが、QQはに子プロセスを開き、ビデオファイルを受け取り、あなたはQQの外にドロップすると、ダウンロードは、引き続き実行するタスクをダウンロードする必要はありません

  シナリオ:子プロセスに親タスク、タスクがまだ完了していない、親プロセスが終わって、子プロセスは、の意味で続行されません

以下からのインポートプロセスマルチプロセッシング
インポート時間

#側室の生活
:DEFタスクを()
    印刷(.....の宮殿
    time.sleep(50 
    印刷(妾は......で死亡した


IF __name__ == __main__ 
    #康が王位上昇
    印刷(.....即位

    #はの側室見つける
    のp =プロセス(対象= タスク)

    デーモンに#セットがオンにする前に設定する必要があります
    p.daemon = 
    p.start() 
康Jiabengの
    time.sleep(3 
    印刷(" 物語の終わり!"

2.ミューテックス

  定義:相互排他ロック(リソースがロックされている場合は、他のプログラムを実行することはできません)

  注意:ロックではなく、リソースが実行できないロックアップが、コード内のコードのあなたのレベルを制限するために、

  あなたはロックしたい理由:同時競争が同時に同じリソースを操作し、このようなマルチプロセスとして、資源をもたらす、データが混乱につながります

  解決策:1.ダイレクトプラスに参加

        短所:1オリジナルの並行タスクはデータの混乱を回避しながら、シリアルとなりますが、効率が低下するので、子はローストを開けません

                    2.持っていた複数のプロセスが設定され死んだ、無理の実行順序、公正な競争で、プラスに参加します

       ミューテックスを追加する2.公共資源、これはまだ他の事を行うには、公正な競争、つかむ最初、実行するために、まず親プロセスであります

  ロックは、その差に参加します:

      参加:固定死んだように、子プロセスは、親プロセスが原因となり、順を実行します、彼は今のすべてのシリアルプロセスの課題である
      、コードの行でもOKである、または公正な競争、実行誰でもつかむ最初、ロックが任意のコードをロックすることができますロックあなたは自分のサイズを調整することができます

      粒子:レベルの一種で、複数の粒子より大きなロックコード、低い効率、およびその逆。

                

   注:プログラムが実行できないように、1再び、ロックするロックしない、対応するリリースを取得

     2.データのセキュリティを保護するために、我々はすべてのプロセスが同じロックを使用することを確認する必要があります

インポート処理をマルチプロセッシング、ロック
のインポート時、ランダム

DEFのタスク1(ロック):
    ロックの使用を開始するには#
    ロック.acquireを(あれば)#は判決と同等である
    印刷(こんにちはジェリーIAM 
    time.sleep(random.randint (02 ))
    を印刷(" 性別は男の子です" 
    time.sleep(random.randint(02 ))
    を印刷(" 時代です15 " 
    のロックを解除するために不足して#
    ロック.releaseを()

DEFのタスク2(ロック) :
    ロック)(.acquire 
    プリント(" ハローIAMオーウェン" 
    time.sleep(random.randint(02 ))
    プリント(" 性別が女の子である" 
    time.sleep(random.randint(02 )) 印刷年齢は48である" ロック.release()

デフTASK3(ロック):
     ロック.acquire()
    印刷(" こんにちはIAMジェイソン" 
    time.sleep(random.randint(02 ))
    印刷(" 性別が女性である" 
    time.sleep(random.randint(02 ))
    プリント(" 年齢が26である" ロック(.release)

の場合 __name__ == ' __main__ ' ロック = ロック()

    P1 =プロセス(目標= TASK1、引数=(ロック))
    P2 =プロセス(目標=タスク2、引数=(ロック))
    P3 =プロセス(目標= TASK3、引数=(ロック))

    p1.start()
    #P1を。参加します()

    p2.start()
    #p2.join()

    p3.start() のp3.join() 
印刷(" !物語の終わり" 
    
疑似コードロック#実装の
IF my_lock == FALSE:
#1 my_lock = 
の##ロックされたコード
      my_lock = Falseのロック解除

3.ipc

  定義:IPCは、プロセス間の協議を通じてで互いに別のプロセス、プロセス間メモリ分離にデータ処理であり、通信のIPCを使用します  

  方法:1.パイプライン:一方向のみの通信、データは、バイナリであります

     2.ファイル:ハードディスク上の共有フォルダを作成しますが、ほとんどのデータの量に制限はなく、ゆっくりとではありません

     3.socket:高い複雑プログラミング、

     4共有メモリ:

      1.Manager:それは、データ構造のリスト辞書などの多くを提供し、それはプロセス間で共有特性を持つデータ構造を提供します

        注意:マネージャで作成されたいくつかのデータ構造はロックされていない、それは問題がある可能性があります

インポートプロセス、マネージャー、ロックマルチプロセッシング
インポート時間


:DEFタスク(データ、L)
    l.acquire()
    NUM =データ[ " NUM " ]#1 
    time.sleep(0.1 
    データ[ " NUM " - ] = NUM 1 
    リットル。リリース()

もし __name__ == ' __main__ ' 
    #1让マネージャ开启一个共享的字典
    M = マネージャー()
    データ = m.dict({ " NUM "10 })

    L = ロック()

    のためにI における範囲(10 ):
        P =プロセス(目標=タスク、引数= (データ、L))
        p.start()

    time.sleep(2 
    印刷(データ)

      2.Queueキュー

        キュー:キューは、FIFO特殊なデータ構造であり、単にラインアップ

        スタック:最後のアウト、ワードローブのように、ボトル入りポテトチップス

        拡張:実行が順次巣の外に進んだことを意味するとき、関数呼び出し、関数呼び出しスタック、

          あなたは、関数、関数のスタックを呼び出すと、スタックは、関数を終了します

インポートキューのマルチプロセッシング
キューが指定されていない作成番号MAXSIZE位に制限されない
Q =キュー(3 
#記憶素子
#1 q.put(" ABC " 
#q.put(" HHH " 
#1 q.put(" KKK " 

印刷#(Q。GET ()) のq.put(OOO の容量がいっぱいになると誰かがしていきますキューから利用可能な位置データを取ったまでブロック状態にするために、コールの時、)#を

#削除要素
#印刷(Q。取得())キューが空の場合、誰かがしていきますキューにメモリから新しいデータを入力するまで、あなたはブロックされます呼び出すときに、#を

#印刷(Q。取得()) を印刷(Q。GET ())


例外がスローされ、キューが空Falseの時にされたときに、ブロッキングが#のデフォルト設定をブロックされているかどうかを示す#BLOCK 
Q.のGET(ブロック= Trueの場合、タイムアウト= 2 
#ブロックは、キューがFalseに設定されている場合、デフォルトのブロック#がブロックされているかどうかを示し、完全な場合、例外がスローされ
#1 q.putは(123 、ブロック= 偽)
#タイムアウトがブロッキング・タイムアウトを表し、経時的、または値または例外がスローされていないまたは位置は、ブロック内の真のみ有効でありません

4.生産者、消費者のモデル

  データ処理の一つのルーチンデータの種類と解決の問題:定義

  生産者と消費者問題:彼らは両方の処理速度アンバランス、速い遅いの1、他の当事者を待つ必要が生じ

  問題解決のアイデア:

    もともと二つの側面が一緒に結合され、消費者は生産者が治療を開始する前に完全に生成するのを待ち、およびその逆なければなりません。

    データが直接対話することはできませんし、双方が共通の容器を必要とするように、今、二つの側面、生産のための責任者、処理のための責任者を分離することが可能です。次いで、容器にプロデューサは、データコンシューマを取り除きます。これは待たずに、自分の操作を行うことができ、両方の処理速度の不均衡の問題を解決するだろう。

DEF(Q)EAT:
      I における範囲(10 :)
        消費する#
        ローズを。= Q GET ()
        time.sleep(random.randint(02 ))
        を印刷(ローズ、" 完成!" 

#生産タスク
make_rose DEF(Q):
     I におけるレンジ(10 ): 再現
        time.sleep(random.randint(02 ))
        を印刷(" !ディスクピーマン豚肉仕上げの%sの"%のI)
        ローズ= ディスクピーマンの豚肉の%S 私は
        #キューに生成されたデータを完了
        q.put(ローズ)

のIF __name__ == __main__ 
    #は、共有キューを作成
    Q = キュー()
    make_p =プロセス( = make_roseターゲット、引数= (Q))
    eat_p =プロセス(目標= EAT、引数= (Q))


    make_p.start()
    eat_p.start()

 

 

 

     

 

おすすめ

転載: www.cnblogs.com/wyf20190411-/p/10969412.html