Python|マルチタスク:スレッド、プロセス、コラボレーション--あなたが望んでいるのはすべてここにあります

23608 ワード

一、マルチタスク——スレッド
1.先行知識:
1.オペレーティングシステムの知識:オペレーティングシステムの呼び出し方法--タイムスライスの回転、時間優先度2.同時:偽のマルチタスク:CPUコア数が同時に実行する必要があるタスク数より小さい;記憶:マジシャンは左右の手で互いにサーブを投げ合った.

3.並行:真のマルチタスク

2.Pyhon 3.Xでマルチスレッドを作成するには、次の2つの方法があります.
2.1法一:threadingパッケージをインポートする方法:
キーステップコード:

import threading
t=threading.Thread(target=[args=(                  )])  #   threading Thread          ;#          ,       ,         (),            
t.start()  #              。

  • 2.2法二:threading.Thread()は、親として継承できるクラスオブジェクトです:

  • キーステップコード:
    import threading
    class MyThread(threading.Thread):
        def run(self):  
            pass
    t=MyThread()  #       
    t.start()  
    
    #     run  ,         start()       run()  。  :run()      ,      。  ,   run                  。


  • 3.メインスレッド、サブスレッドの実行順序
  • 3.1マルチスレッドプログラムの実行順序は不確定である:実際、メインスレッドとサブスレッドの実行順序はオペレーティングシステムによって決定され、サブスレッドを開くには時間がかかり、メインスレッドを実行するにも時間がかかり、この2つの時間は不確定である.だからどうやって実行するのか分からない.

  • 4.マルチスレッドによる「リソース競合」の問題と解決策
  • 4.1グローバル変数を共有し、マルチスレッドの設計優位性を実現するが、言語に関係なく、オペレーティングシステムの下位設計と関係のあるリソース競争の問題もある.
  • 4.2ソリューション-反発ロック
  • threading.ロック()メソッドacquire()メソッドおよびrelease()メソッド
  • を呼び出すmutexオブジェクトを作成します.
  • 相互反発ロック間のコードは一般的に少ないほど良いが、具体的には必要に応じている.

  • 4.3相互反発ロックに存在する問題:デッドロック-->相互に相手のリソースを待つ
    解決策:タイムアウト時間の追加、銀行家アルゴリズムなど

  • 二、マルチタスク——プロセス
    1.基本的な定義、概念及び前置き知識
    1.1オペレーティングシステム[書き込み時コピー(修正時にコピー)]--オペレーティングシステムの概念で、マルチプロセス基本コードは共有されており、メモリなどのリソースがコピーされます.
    1.2 1つのプログラムは一般的に複数のプロセス(補助記憶:レシピは1部のみ)を有することができ、各プロセスはオペレーティングシステムにおいて1つのPIDに対応する.
    1.3プロセスステータス:準備完了-->実行-->待ち
    1.4プロセスはシステムが資源を分配する単位である.
    2.Pyhon 3.Xでマルチプロセスを作成する方法
    
    import multiprocessing
    ...
    p = muttiprocessing.Process(target=       , args=(                 ))
    p.start()
    ...
    
    #     
    q = multiprocessing.Queue()
    #      
    po = multiprocessing.Pool()
    #                   
    po.apply_async(      ,(          ,))
    ...
    

    2.実行手順
  • 2.1プロセス実行順序なし(サブプロセスがオンであることを前提とする):サブプロセス、メインプロセス実行順序不確定
  • .
  • 2.2 joinメソッド--スレッド、プロセス
  • 3.プロセス間の通信
  • 3.1 socket--プロセス間ネットワーク通信
  • 3.2 Queue--[キュー]によるプロセス間通信
  • 3.2.1 multiprocessing.Queue()インスタンスオブジェクトにはput()--保存,get()などのメソッドがあり,その戻り値はTrue,Flaseなどのboolタイプである.
  • 3.2.2拡張:1>単一プロセス間通信、リストなど、Queueモジュールを直接使用する;2>プロセス間通信--multiprocessing.Queue()とsocket()3>プロセスプールにおけるサブプロセスとメインプロセスとの通信に関し、Multiprocessingを使用する必要がある.manager()のロック()とQueue()
  • 3.3プロセス間でグローバル変数を共有しない
  • 4.プロセスプール--Pool
  • 4.1プロセスマネージャ:大量の(不確定な数の)プロセスがある場合、プロセスの実行を合理的かつ効率的に利用することができます.プロセスの作成と破棄は大量のシステムリソースを占有し、1つのプロセスが終了して後で待つプロセスにこのシステムリソースを引き続き使用させることができれば、システムリソースの利用率を高めることができます.これがpoolの威力です.
  • 4.2 Pool().join()#ブロック:プロセスプールのメインプロセスとマルチスレッド、マルチプロセスは異なり、メインプログラムはサブプロセスの実行が終了するのを待たずに閉じる可能性があるため、プロセスプールを閉じた後にpoを追加する必要がある.join()メソッドは、ブロックの役割を果たします.
  • 4.3特徴:一部のプロセスは、前のプロセスプールのプロセス番号
  • を継承します.
  • 4.4要点1:プロセスプールのプロセスに異常が発生すると異常が報告されない可能性があり、プロセスプールのプロセスが実行するか否かを判断することができない.
  • 4.5要点2:キューがプロセスプールに遭遇した場合、multiprocessing.Manager().Queue()
  • を使用します.
    三、マルチタスク——協力
    1.前課の知識
  • 1.1 from collections import Iterable,Iterator
  • 1.2 raise StopIteration pythonのfor...in...キャプチャ
  • Python3.Xには反復可能なオブジェクトがあり,生成された結果ではなく結果を生成する方法を格納する小さな空間を占有する.

  • 2.反復器&ジェネレータ
  • 2.1反復可能オブジェクトは反復器に等しくなく、str、list、tuple、dict
  • python特有のリスト生成式[x for x in range(10)]、メタグループ生成式;占有スペースが小さい.
  • 2.3 next();iter()メソッド
  • 2.4 yieldジェネレータ--特殊な反復器
  • 2.Initメソッドは、同じ反復器を返すたびに、複数回反復することはできません.異なる反復器を返すたびに、複数回反復することができます.

  • 3.反復器-->ジェネレータyield->greenlet-->gevent、geventパッチ
    
    # greenlet     
    from greenlet import greenlet
    
    gre1 = greenlet(      )
    
    gre1.switch()
    # gevent   
    import gevent
    
    
    def fun(n):
        for i in range(n):
            print(gevent.getcurrent(), i)
            gevent.sleep(1)  #  time.sleep()
    
    g1 = gevent.spawn(fun, 10)
    g2 = gevent.spawn(fun, 10)
    g1.join()
    g2.join()
    
    # gevent         
    
    from gevent import monkey
    import gevent
    import random
    import time
    
    
    #         
    monkey.patch_all()  #               ,  gevent        
    
    
    def work(coroutine_name):
        for i in range(10):
            print(coroutine_name, i)
            time.sleep(random.random())
    
    gevent.joinall([
            gevent.spawn(work, "work1"),
            gevent.spawn(work, "work2")
    ])

    二、マルチタスク——プロセス
    1.基本的な定義、概念及び前置き知識
    1.1オペレーティングシステム[書き込み時コピー(修正時にコピー)]--オペレーティングシステムの概念で、マルチプロセス基本コードは共有されており、メモリなどのリソースがコピーされます.
    1.2 1つのプログラムは一般的に複数のプロセス(補助記憶:レシピは1部のみ)を有することができ、各プロセスはオペレーティングシステムにおいて1つのPIDに対応する.
    1.3プロセスステータス:準備完了-->実行-->待ち
    1.4プロセスはシステムが資源を分配する単位である.
    2.Pyhon 3.Xでマルチプロセスを作成する方法
    
    import multiprocessing
    ...
    p = muttiprocessing.Process(target=       , args=(                 ))
    p.start()
    ...
    
    #     
    q = multiprocessing.Queue()
    #      
    po = multiprocessing.Pool()
    #                   
    po.apply_async(      ,(          ,))
    ...
    

    2.実行手順
  • 2.1プロセス実行順序なし(サブプロセスがオンであることを前提とする):サブプロセス、メインプロセス実行順序不確定
  • .
  • 2.2 joinメソッド--スレッド、プロセス
  • 3.プロセス間の通信
  • 3.1 socket--プロセス間ネットワーク通信
  • 3.2 Queue--[キュー]によるプロセス間通信
  • 3.2.1 multiprocessing.Queue()インスタンスオブジェクトにはput()--保存,get()などのメソッドがあり,その戻り値はTrue,Flaseなどのboolタイプである.
  • 3.2.2拡張:1>単一プロセス間通信、リストなど、Queueモジュールを直接使用する;2>プロセス間通信--multiprocessing.Queue()とsocket()3>プロセスプールにおけるサブプロセスとメインプロセスとの通信に関し、Multiprocessingを使用する必要がある.manager()のロック()とQueue()
  • 3.3プロセス間でグローバル変数を共有しない
  • 4.プロセスプール--Pool
  • 4.1プロセスマネージャ:大量の(不確定な数の)プロセスがある場合、プロセスの実行を合理的かつ効率的に利用することができます.プロセスの作成と破棄は大量のシステムリソースを占有し、1つのプロセスが終了して後で待つプロセスにこのシステムリソースを引き続き使用させることができれば、システムリソースの利用率を高めることができます.これがpoolの威力です.
  • 4.2 Pool().join()#ブロック:プロセスプールのメインプロセスとマルチスレッド、マルチプロセスは異なり、メインプログラムはサブプロセスの実行が終了するのを待たずに閉じる可能性があるため、プロセスプールを閉じた後にpoを追加する必要がある.join()メソッドは、ブロックの役割を果たします.
  • 4.3特徴:一部のプロセスは、前のプロセスプールのプロセス番号
  • を継承します.
  • 4.4要点1:プロセスプールのプロセスに異常が発生すると異常が報告されない可能性があり、プロセスプールのプロセスが実行するか否かを判断することができない.
  • 4.5要点2:キューがプロセスプールに遭遇した場合、multiprocessing.Manager().Queue()
  • を使用します.
    三、マルチタスク——協力
    1.前課の知識
  • 1.1 from collections import Iterable,Iterator
  • 1.2 raise StopIteration pythonのfor...in...キャプチャ
  • Python3.Xには反復可能なオブジェクトがあり,生成された結果ではなく結果を生成する方法を格納する小さな空間を占有する.

  • 2.反復器&ジェネレータ
  • 2.1反復可能オブジェクトは反復器に等しくなく、str、list、tuple、dict
  • python特有のリスト生成式[x for x in range(10)]、メタグループ生成式;占有スペースが小さい.
  • 2.3 next();iter()メソッド
  • 2.4 yieldジェネレータ--特殊な反復器
  • 2.Initメソッドは、同じ反復器を返すたびに、複数回反復することはできません.異なる反復器を返すたびに、複数回反復することができます.

  • 3.反復器-->ジェネレータyield->greenlet-->gevent、geventパッチ
    
    # greenlet     
    from greenlet import greenlet
    
    gre1 = greenlet(      )
    
    gre1.switch()
    # gevent   
    import gevent
    
    
    def fun(n):
        for i in range(n):
            print(gevent.getcurrent(), i)
            gevent.sleep(1)  #  time.sleep()
    
    g1 = gevent.spawn(fun, 10)
    g2 = gevent.spawn(fun, 10)
    g1.join()
    g2.join()
    
    # gevent         
    
    from gevent import monkey
    import gevent
    import random
    import time
    
    
    #         
    monkey.patch_all()  #               ,  gevent        
    
    
    def work(coroutine_name):
        for i in range(10):
            print(coroutine_name, i)
            time.sleep(random.random())
    
    gevent.joinall([
            gevent.spawn(work, "work1"),
            gevent.spawn(work, "work2")
    ])