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 得ます())