Pythonのスレッド小さなノート(1)

スレッド:オペレーティング・システムの動作のスケジューリングの最小単位、命令の代替配列の単一のセット。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()

  

おすすめ

転載: www.cnblogs.com/gtq7512/p/11374339.html