Pythonの基礎--GILグローバルインタプリタロック、イベント、イベント、セマフォ、デッドロック、再帰的ロック

PS:pythonの通訳、多くのがありますが、最も一般的なのは、CのPythonインタプリタであります

GILグローバルインタープリタロック:
    GILの性質に排他ロックである:同時シリアルになる、データのセキュリティを確保するために、効率を犠牲に

    実行の同じプロセスで複数のスレッド防止するために使用されると同時に(同じプロセス内で複数のスレッドが、同時達成するために、並行して達成することができません)

    メモリ管理CのPythonインタプリタはスレッドセーフではありませんので、GILの存在があります

    ガベージコレクション:

        1、参照カウント

        2、明確なラベル

        3、世代回復

    必要なポイントであれば協議の有用性のPythonのマルチスレッドの研究:

        10S:計算集約4つのタスクを実行しながら、

计算密集型
からマルチプロセッシングインポートプロセス
 からスレッドインポートスレッド
 #1 mport OSを、時間
DEF 動作():
    のRES = 0
     のための I における範囲(100000000 ):
        RES * = I 


なら __name__ == ' __main__ ' 
    L = []
     印刷(os.cpu_count())  为6机本核 
    =開始time.time()
     のために範囲を(6):
        p =プロセス(目標=仕事)#耗时4.732933044433594 
        P =スレッド(目標=仕事)耗时22.83087730407715 
        l.append(P)
        p.start()
    のための P におけるL:
        p.join()
    を停止 = time.time()
     印刷' 実行時間である%sの'%(ストップ・スタート))

 

        シングルコアの例:

            リソースを節約するためにオープンスレッドより

        マルチコアの場合:

            オープンなプロセス:10秒

            オープンスレッド:40代

        IO集約型のタスクが同時に4を実行します

IO密集型
からマルチプロセッシングインポートプロセス
 からスレッドインポートスレッド
 インポート通し
 インポートOSは、時間
 DEF )(動作:
    time.sleep( 2 


もし __name__ == ' __main__ ' 
    L = []
     プリント(os.cpu_count()) 本机为6は核 
    =開始time.time()の
     ための I における範囲(4000 :)
        P =プロセス(目標=仕事)9.001083612442017s時間がかかり、より多くの、ほとんどの時間は、作成プロセスに費やさ
        2.051966667175293sマルチかかるのp- =スレッド(ターゲット=作品)#
        l.append(P-)
        p.start()
    のための p型Lを:
        p.join()
    STOPは = time.time()
     印刷' RUN時間がS%'%(スタート-STOP))

 

        シングルコア:オープンスレッドより省資源

        マルチコア:オープンスレッドより省資源

    

イベントイベント:

    

スレッディングインポートイベント、スレッド
 のインポート

イベントオブジェクトへの氏 
E = イベント()


DEF ライト():
     印刷赤点灯のn 
    time.sleep( 3。 
    e.set()  シグナル
    を印刷' 緑の光' 

DEF CAR(名):
     印刷' %Sは、赤色光である'%の名称)
    e.wait()  ウェイト信号
    を印刷' レースの%S燃料ドア'名)

T =スレッド(目標= 光)
t.start()

のための I における範囲(10 ):
    T =スレッド(目標=車、引数=(' 伞兵%S 'I))
    t.start()

 

 

 

セマフォ:知識の異なる点に対応するさまざまな分野で

    ミューテックス:トイレ(ピット)
    セマフォ:公衆トイレ(ピットビット)

スレッディングインポートセマフォ、スレッド
 のインポートのインポートランダム


SM =セマフォ(5)  5ビットのピット含む構築された公衆トイレ

DEF タスク(名前):
    sm.acquire()
    印刷Sがピットビットを占め%'%の名前)
    time.sleep(random.randint( 1,3 )) 
    ()sm.release 

 I における範囲(40 ):
    Tはスレッド(目標=タスク、引数= = (I))
    t.startを()

 

  

デッドロック:

    RLOCKは、連続的に取得し、人々をつかむために最初のロックを解除することができます

    各ロックボディ・カウントは1だけインクリメントさ取得します

    たびにロック解除ボディカウントをデクリメント

    限りロックカウントをつかむことができる他のゼロではないよう

クラスMyThread(スレッド):
     DEFを実行(セルフ):  は、runメソッドでrunメソッドの呼び出しをトリガーに自動的にスレッドを作成して、自動的にトリガ関数func1とfunc2のと同等です
        self.func1()
        self.func2()

    DEFのfunc1の(自己を):
        mutexA.acquire( )
        プリント' %はSロックつかん'%をself.name)  self.name等価current_thread()。名
        mutexB.acquire()
         プリント' %SのBグラブロック'self.name)
        mutexB。リリース()
        印刷' %S Bロック解除'self.name)
        mutexA.release()
        を印刷' %S Aロック解除'self.name)

    DEFの関数func2(自己):
        mutexB.acquire()
        プリント' %SのBグラブロック'self.name)
        (time.sleep。1 
        mutexA.acquire( )
        プリント' %は、Sロックつかん'%を)self.name 
        mutexA.release()
        プリント' %Sロック解除'self.name)
        mutexB.release()
        プリント' %S Bロック解除"self.name)

のための I範囲(10 ):
    T = MyThread()
    t.start()

 

 

再帰的ロック:

輸入スレッド
 
 
クラスMyThread(threading.Thread):
 
    デフ(自己)を実行します。
         グローバルN1、N2 
        lock.acquire()   加锁 
        N1 + = 1枚のプリント(self.name +は' にN1を設定する' + STR(N1))
        ロック.acquire()   再次加锁 
        N2 + = N1
         プリント(self.name +が' にN2を設定' + STR(N2))
        lock.release()
        lock.release()
N1、N2 = 0、0 
ロック =
        
 threading.RLock()
 
もし __name__ == ' __main__ ' 
    thread_list = []
     のための I における範囲(5 ):
        T = MyThread()
        t.start()
        thread_list.append(T)
    のための T thread_list:
        t.join( )
    プリント' 最終NUMた:%d、%D '%(N1、N2))

 

おすすめ

転載: www.cnblogs.com/tulintao/p/11354459.html