スレッド:オペレーティング・システムの動作のスケジューリングの最小単位、命令の代替配列の単一のセット。Pythonでスレッドは、オペレーティングシステムによって管理されるネイティブC言語のスレッド(オペレーティングシステム)です。
GILのなので、いつでも同じプロセスは、唯一のスレッドが実行されています。
Pythonでマルチスレッドではありません、いくらCPUコア!
スレッドのpythonの知識:
(1)スレッドの作成:
この方法の一つ
インポート通し、時間 DEF(N)を実行する: プリント(N、 '開始'、threading.get_ident) time.sleepを(1) プリント(N、 '完了') T = threading.Thread(目標=ラン、引数の=(I 、2)) t.start() プリント(threading.current_thread())
方法二
インポートスレッド、時間の クラスMythread(threading.Thread): デフ__init __(自己、N): スーパー(Mythread、自己).__のinit __() self.n = N デフ(自己)を実行します。 プリント( "XXXX%s"は%の自己.N) T1 = Mythread( 'T1') T2 = Mythread( 'T2') t1.start() t2.start()
(2)ねじロック:
インポート通し、時間 NUM = 0 ロック= threading.Lock() DEF(N)実行: グローバルNUMの 開始= time.time() lock.acquire()#进程锁(互斥锁) の範囲内のiについて(1000000): NUM + = 1 time.sleep(1) lock.release() プリント(N、time.time() -開始) t_obj = [] Iの範囲内の(2)の場合: T = threading.Thread(目標=ラン、引数=(I)) t.start() t_obj.append(t)を tについてt_objで: t.join() プリント( "NUM"、NUM)
再帰的ロック
インポート通し、時間 デフRUN1(): 印刷( "第1の部分データつかむ") lock.acquire() グローバルNUMの NUM + = 1 )(lock.releaseを NUM返す :DEF RUN2() プリント(「第2部分データをつかみます「) lock.acquire() グローバルNUM2の NUM2 + = 1 lock.release() 戻りNUM2 :DEF RUN3() lock.acquire() RES = RUN1() RUN1とRUN2の間にプリント( '-------- ----- ') RES2 = RUN2() lock.release() プリント(RES、RES2) NUM、NUM2 = 0,0 ロック= threading.RLock()#递归锁 範囲のiについて(1): T = threading.Thread(目標= RUN3) t.start() しばらくthreading.active_count()= 1:! プリント(threading.active_count()) 他: プリント( '----すべてのスレッドが---行わ') プリント(NUM、NUM2)
(3)デーモン。
(50)のための範囲内のI: T = threading.Thread(対象= RUN、引数=(I)) t.setDaemon(真)#デーモン、子スレッドを待たずに、メインスレッドが終了され、プログラムが終了し トンを。開始()
(4)信号の量:
インポートスレッド、時間 デフ実行(N、A): semaphore.acquire() 印刷( "スレッドを実行します:%sの\ nは" %n)を time.sleep(a)の semaphore.release() __name__ == '__main__'の場合: セマフォ= threading.BoundedSemaphore(5)位最多允许5个线程同时运行 Iの範囲内(22)の場合: T = threading.Thread(目標=ラン、引数=(I、I)) t.start() スレッドながら.active_count()= 1:! )(#印刷threading.active_countを渡し 、他: プリント( '----すべてのスレッドが行わ---') #print(NUM)
(5)キュー:
Queue.Queue(n)はFIFO queque.LifiQueue(N)LIFO queue.PriorityQueue(n)はプライオリティキューnは吐出データの数可能にするために設けることができる 再生されたデータブロックかqueue.put(MAXSIZE、ブロック、タイムアウト)タイムアウト渋滞、交通時間 queue.get(ブロック、タイムアウト)フェッチ queue.sizeを
インポートキュー Q = queue.Queue(3) q.put(1) q.put(2) q.put(3) プリント(q.qsize()) プリント(q.get()) プリント(q.get( )) プリント(q.get()) してみてください: プリントを(q.get(ブロック))= Falseの eとqueue.Empty除い: プリント( "キューが空です")
(6)イベント
スレッドツールとの間の同期のイベント
フラグを設定するeven.set()
(even.clear)はフラグクリア
(even.is_setを)か否かを判断する
)(偶数= threading.Even
インポート通し、時間 state_list = [ '赤'、 '黄' '緑'] 状態= '' ロック= threading.Lock() さえ= threading.Event() EVEN1 = threading.Event() DEF)(ラン: カウント= 0 真中: <:10カウント場合 even.clear() プリント( 'LEDの状態がある:033 [41 \; 1メートル赤色033 [0メートルを\ n \') ELIFカウント> = 10とカウント<15: プリント(」 LEDの状態は次のとおりです。033 [43 \; 1メートルイエロー\ 033 [0メートルを\ n ') ELIFカウント> = 15とカウント<25: even.set() プリント(' LEDの状態は次のとおり、033 \ 1メートルグリーン033 [42 \ [0メートル\ n 'の) 他: = 0カウント 数+ = 1 time.sleep(1) デフRUN1(): グローバル状態 トゥルー中: even.is_set場合(): プリント( "私は\ nを行くよ") (1)time.sleep 他: プリント( "私は、停止\ nのよ") even.wait() T = threading.Thread(目標=ラン) t.start() T1 = threading.Thread(目標= RUN1) t1.start()