サーティーン、TCPサーバーの同時実行
13.1、サーバ要件
1、固定IPおよびポート
2,24時間サービス
3、同時サポート
13.2コード
輸入ソケット からスレッド輸入スレッド サーバー = socket.socket() server.bind((' 127.0.0.1 '、8080 )) (server.listen 5 ) デフ話(conn)を: ながら真: 試す: データ = conn.recv( 1024 ) の場合 ではないデータ: ブレーク プリント(data.decode(' UTF-8 ' )) conn.send(data.upper()) を除きます:eとConnectionResetError 印刷(e)の ブレーク はconn.close() しばらく真: CONN、ADDR = server.accept() 、T =スレッド(対象=話、引数= (CONN)) t.start()
フォーティーン、GIL(グローバルインタプリタロック)
14.1、CPythonの通訳
1、GILは、ユニークなコンセプトの通訳CPythonのです
複数のスレッドを開くために同じプロセスではCPython、マルチコアの利点を活用することができ、実行の同じ時間だけスレッド、2、
GILの存在の14.2理由
Pythonのプロセス内で、すべてのデータは、インタープリタコードを含む、共有します。すべてのプロセスは、ガベージコレクションプロセスを含め、コードを実行するインタプリタにアクセスする必要があります。したがって、唯一のインタプリタコードロックによるものです
データを避けるためには、最初のガベージコレクションメカニズムです。
14.3、プロセスとマルチスレッドオプション
14.3.1、プロセスとマルチスレッド機能
図1に示すように、プロセスは、マルチコアの利点が、オーバーヘッドを取ることができます
2、頭上の小さなスレッド、我々は、マルチコアの優位性を活用することができません
14.3.2結論
1、に適用されるCPUのない量I / Oの面は、オープンマルチプロセスをブロックしていないが、より多くのメモリを要しているので、I / O集約型のタスクをマルチスレッド。
図2に示すように、計算集約的なタスクに使用マルチプロセス、およびより多くの原子力エネルギーを効果的に計算速度を向上させます。
再帰的なロックとXVのデッドロック
15.1デッドロック
お互いを待っているの現象によるリソースの競合による実装プロセスにおける二つ以上のプロセスまたはスレッド、。外力がない場合、彼らはそれを促進することはできません。
輸入スレッドをスレッドから、ロックの
インポート時
mutexA =ロック()
mutexB =ロック()
クラスMyThread(スレッド):
デフ(自己)を実行します。
self.func1()
self.func2()
defは関数func1(自己):
mutexA.acquire( )
プリント(1、self.name)
mutexB.acquire()
プリント(2、self.name)
mutexB.release()
プリント(3、self.name)
mutexA.release()
プリント(4、self.name)
デフ関数func2 (自己):
mutexB.acquire()
プリント(5、self.name)
time.sleep(1)
mutexA.acquire()
プリント(6、self.name)
mutexA.release()
プリント(7、self.name)
mutexB.release()
印刷(8、self.name)
範囲(2)内のiについて:
T = MyThread()
t.start()
1スレッド1
2スレッド1
3スレッド1
4スレッド1
5スレッド1
1スレッド2
15.2、再帰的なロックRLOCK
ロックの獲得をつかむために最初の人であると複数回を解放することができます
それぞれが一つのロック・カウントを取得します
毎回1によるロック解除回数
限りロックカウントが0ではないとして、他のスレッドがロックをつかむことができます
デッドロックを回避
輸入スレッドをスレッドから、RLOCKの
インポート時
mutexA = mutexB = RLOCK()
クラスMyThread(スレッド):
デフ(自己)を実行します。
self.func1()
self.func2()
defは関数func1(自己):
mutexA.acquire()
印刷( 1、self.name)
mutexB.acquire()
プリント(2、self.name)
mutexB.release()
プリント(3、self.name)
mutexA.release()
プリント(4、self.name)
DEF関数func2(自己) :
mutexB.acquire()
プリント(5、self.name)
time.sleep(1)
mutexA.acquire()
プリント(6、self.name)
mutexA.release()
プリント(7、self.name)
mutexB.release()
印刷(8、self.name)
範囲(2)内のiについて:
T = MyThread()
t.start()
1スレッド1
2スレッド1
3スレッド1
4スレッド1
5スレッド1
6スレッド1
7スレッド1
8スレッド1
1スレッド2
2スレッド2
3スレッド2
4スレッド2
5スレッド-2
6スレッド2
7スレッド2
8スレッド2
XVIセマフォ
指定されたセマフォが5であれば1は、セマフォは、ロックが実行するために取得するための5つのタスクがあり、同じ時間をロックされています。
スレッドの輸入糸を、セマフォ 輸入スレッド インポート時間 デフFUNC(): s.acquire() 印刷(。threading.current_thread()のgetName()) time.sleep( 3 ) s.release() の場合 __name__ == ' __main__ ' : S =セマフォ(5 ) のための I における範囲(10 ): T =スレッド(目標= FUNC) t.start()
スレッド1 スレッド -2 スレッド -3 スレッド -4 スレッド -5 スレッド -7 スレッド -8 スレッド -6 スレッド -9 スレッド -10