Python多線程的threading Event


Python threading模塊提供Event對象用於線程間通信。它提供了一組、拆除、等待用於線程間通信的其他方法。

event它是溝通中最簡單的一個過程之中,一個線程產生一個信號,號。Python 通過threading.Event()產生一個event對象。event對象維護一個內部標志(標志初始值為False),通過set()將其置為True。wait(timeout)則用於堵塞線程直至Flag被set(或者超時,可選的),isSet()用於查詢標志位是否為True,Clear()則用於清除標志位(使之為False)。

  設置\清除信號

  Event的set()方法可設置Event對象內部的信號標志為真,Event對象提供了isSet()方法來推斷其內部信號標志的狀態,使用set()方法后,isSet()方法返回True。clear()方法可清除Event對象內部的信號標志(設為False)。使用clear方法后。isSet()方法返回False 

 等待

 當Event對象的內部信號標志為False時。wait方法一直堵塞線程等待到其為真或者超時(若提供,浮點數,單位為秒)才返回,若Event對象內部標志為True則wait()方法馬上返回。

舉例:

下述是一段模擬“client監聽並處理硬件port消息”的程序片段:硬件port消息發送時機是隨機的(通過random實現),read線程負責讀消息並通知parse線程去處理。

import threading  
import time  
import random  
L = []   
def read():   
    count =2   
    while 1:   
        count = random.randint(0,1)   
        if count:   
            L.append('Hello, darling,I love you\n')   
            L.append('You are so sweet~\n')   
        if L:   
           evt.set()   
           print 'new rcvd sent to \'parse thread\'\n'   
        time.sleep(2)   
    print 'never here\n'   
       
def parse():   
    while 1:   
       if evt.isSet():   
            evt.clear()          
            print repr(len(L)) +' messages to parse:\n'   
            while L:   
                print L.pop(0)   
            print 'all msg prased,sleep 2s\n'   
            time.sleep(2)   
       else:   
            print 'no message rcved\n'   
            time.sleep(2)   
    print 'quit parse\n'   
if __name__ == '__main__':   
    evt = threading.Event()   
    R = threading .Thread(target = read)   
    P = threading .Thread(target = parse)   
    R.start()   
    P.start()   
    time.sleep(2)   
    R.join()   
    P.join()   
    #time.sleep(2)   
    print 'end'  


版權聲明:本文博客原創文章,博客,未經同意,不得轉載--“http://blog.csdn.net/suipingsp”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM