グローバルインタプリタロック

TCP通信

  サーバー:1.同時サポートするために、固定IPとポートを持っている2. 24時間サービス、3。

客户端
インポートソケット
クライアント = socket.socket()
client.connect((' 127.0.0.1 '8080 ))
 しばらく真:
    client.send(B ' こんにちは' 
    データ = client.recv(1024 
    印刷(data.decode (' UTF-8 ' ))

服务端
インポートソケット
からインポートスレッドのスレッド
サーバ = socket.socket()
server.bind((' 127.0.0.1 '8080 ))
server.listenを(5 
デフタスク(CONN):
    ながら真:
         試す
            データ = conn.recv(1024 の場合のデータ== 0ブレーク
            プリント(data.decode(' UTF-8 ' ))
            conn.send(data.upper() )
        ConnectionResetError除いとしてE:
            プリント(e)の
            ブレーク
    はconn.close()
しばらく真:
    CONN、ADDR = server.accept()
    、T =スレッド(対象=タスク、引数= (CONN))
    t.start()

  同時実行が同時に同じプロセスで複数のスレッドを防止するために使用されるデータのセキュリティを確保するためのシリアル犠牲効率、となります:pythonインタプリタ、最も一般的なのはCPythonインタプリタでの多くがあり、GILは、ミューテックスの本質であります(複数の同じプロセス内のスレッドが、同時達成するために、並行して達成することができない)メモリ管理CPythonのインタプリタはスレッドセーフではないので、GILの存在であります

ガベージコレクション:1. 2. 3.世代回復フラグをクリア参照カウント

10S計算集約型のタスク4
シングルコアの場合、オープンスレッドより省資源
オープンプロセスオープンスレッド10Sの40代のマルチコアケース

4 IO集約型のタスク  
のオープンスレッド、シングルコアの状況はより省資源である
オープンより多くの資源保存マルチコア・スレッドの場合

计算密集型
 からインポート処理をマルチプロセッシング
 からインポートスレッドスレッド
インポートOSを、時間
DEF動作():
    のRES = 0 
    のための I における範囲(100000000 ):
        RES * = I
 なら __name__ == ' __main__ ' 
    L = [] 
    プリント(OS .cpu_count())
    開始 = time.time()
     のための I における範囲(4 :)
        #P =スレッド(目標=仕事)#20.15457773208618
        P =プロセス(目標=仕事)#10.021640539169312 
        l.append(P)
        p.start()
    のための P におけるL:
        p.join()
    停止 = time.time()
    プリント(' ランタイム%sである'%(停止- ))開始

IOを密集型
からインポート処理をマルチプロセッシング
 からインポートスレッドスレッド
インポート通し
OS、インポート時間
)DEF(動作:
    time.sleep(1 もし __name__ == ' __main__ ' 
    L =[] 
    プリント(os.cpu_count())
    開始 = time.time()の
     ための I 範囲(400 ):
        P =プロセス(目標=仕事)#10.692718029022217 
        #1 P =スレッド(目標=仕事)#1.040785312652588 
        l.append( P)
        p.start()
    のための P におけるL:
        p.join()
    停止 = time.time()
    プリント(ストップ -start)

GIL通常のミューテックス

インポートスレッドスレッド
インポート時間
N = 100 
DEF試験():
    グローバルn個の
    TMP = Nの
    time.sleep(1 
    N = TMP - 1 
t_list = []
 のための I における範囲(100 ):
    T =スレッド(目標= 試験)
    t_list.append(T)
    t.start()
のために T t_list:
    t.join()
プリント(N)

デッドロック

スレッドのインポートをスレッディング、ロック、current_thread、RLOCK 
インポート時間
「」 "
 Rロックが継続的に取得し、ロック解除する最初の人を取得することができます
いずれかによって、それぞれがロック本体の数を取得し
、各リリースタイムマイナスロック本体1のカウント
限りロックカウントがつかむことができる他のゼロではありません

" ""
#mutexA = ロック()
#mutexB = ロック()
mutexA = mutexB = RLOCK()#ABは現在、同じロックである


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

    DEFのfunc1の(自己を):
        mutexA.acquire()
        印刷(" %Sは、ロックをつかん"self.name)#1 self.name同等current_thread()。名前
        mutexB.acquire()
        印刷(' %SのBグラブロック'self.name)
        mutexB.release()
        印刷(" %のS Bのロック解除'self.name)
        mutexA.release()
        印刷(' %Sのロック解除'self.name)

    DEFの関数func2(セルフ):
        mutexB.acquire()
        印刷(' %SのBグラブロック"%の自己。名)
        time.sleep(1 
        mutexA.acquire()
        印刷(" %Sロックグラブ'self.name)
        mutexA.release()
        印刷(' %S Aロック解除'self.name)
        mutexB.release()
        印刷(' %S Bのロック解除"self.name)の

ための I レンジ(10 ):
    T = MyThread()
    t.start()

セマフォ

「」「
 ミューテックス:トイレ(ピットビット)
:セマフォ公衆トイレ(Sピットビット)
」「」
 からスレッディングインポートセマフォ、スレッド
のインポート時
のインポートランダム
SM(=セマフォ。5 )建て5#を備えます公衆トイレピットビット

DEFタスク(名前):
    sm.acquire()
    プリント(' %Sは、ピットビットを占め'%の名称)
    (random.randint(time.sleep 。1図3 ))
    sm.release()

 I における範囲(40 :)
    Tはスレッドを=(対象=タスク、引数= (I))
    t.start()
イベントイベント
から
スレッドのインポートイベント、スレッド のインポートタイム イベントオブジェクト#1に氏は E = イベント() DEFライト(): 印刷(赤点灯のn time.sleep(3。 E。SET ()#信号 プリント(' 緑色光' DEF CAR(名): プリント(' %Sは、赤色光である'%の名前) e.wait()#待機信号 プリント(' レースの%S燃料ドア'%の名前) T =スレッド(ターゲット= ライト) t.start() I における範囲(10 ): T =スレッド(目標=車、引数の=(' 伞兵%S 'I)) t.start()
スレッドのQ 
インポートキュー
「」 " キューを使用する理由データ共有の同じプロセスで複数のスレッドが常にされている キューはパイプラインであるため、 + キューを使用する必要はありませんロック手動ロック自身の問題操作 が悪いためにロック操作のは非常に簡単生成デッドロック "" " のQ = Queue.Queue() のq.put(' hahha ' #印刷(Q. GET ()) #Q = queue.LifoQueue() のq.put(1 #Q .put(2 #1 q.put(3 #プリント(Q. GET ()) #Q = queue.PriorityQueue() ##より少ない数の優先順位の高い #1 q.put((10'' )) #1 q.put((100' ふふふ' )) #1 q.put((0' XXXX ' )) #1 q.put(( - 10' YYYY )) 。#プリント(Q 得ます())

 

おすすめ

転載: www.cnblogs.com/zrh-960906/p/11352942.html