6、第七周-網絡編程-繼承式多線程
阿新 • • 發佈:2018-04-07
重入 super 通用版 鎖對象 out 資源 模塊介紹 屬性 eve
Python threading模塊介紹,threading 是 Python 高級別的多線程模塊。
threading 模塊的函數
- active_count() 當前活動的 Thread 對象個數
- current_thread() 返回當前 Thread 對象
- get_ident() 返回當前線程
- enumerater() 返回當前活動 Thread 對象列表
- main_thread() 返回主 Thread 對象
- settrace(func) 為所有線程設置一個 trace 函數
- setprofile(func) 為所有線程設置一個 profile 函數
- stack_size([size]) 返回新創建線程棧大小;或為後續創建的線程設定棧大小為 size
- TIMEOUT_MAX Lock.acquire(), RLock.acquire(), Condition.wait() 允許的最大值
threading 可用對象列表:
- Thread 表示執行線程的對象
- Lock 鎖原語對象
- RLock 可重入鎖對象,使單一進程再次獲得已持有的鎖(遞歸鎖)
- Condition 條件變量對象,使得一個線程等待另一個線程滿足特定條件,比如改變狀態或某個值
- Semaphore 為線程間共享的有限資源提供一個”計數器”,如果沒有可用資源會被阻塞
- Event 條件變量的通用版本,任意數量的線程等待某個時間的發生,在改事件發生後所有線程被激活
- Timer 與 Thread 相識,不過它要在運行前等待一段時間
- Barrier 創建一個”阻礙”,必須達到指定數量的線程後才可以繼續
Thread 類
- Thread 對象的屬性有:Thread.name、Thread.ident、Thread.daemon。
- Thread 對象方法:Thread.start()、Thread.run()、Thread.join(timeout=None)、Thread.getName、Thread.setName、Thread.is_alive()、Thread.isDaemon()、Thread.setDaemon()
線程調用的方法有兩種:
使用函數的方式進行調用:
import threading import time def run(name): #定義要執行的函數 print("%s is talking" % name) time.sleep(3) if __name__ == "__main__": t1 = threading.Thread(target=run,args=("t1",)) #生成一個線程 t2 = threading.Thread(target=run,args=("t2",)) #生成另一個通道線程 t1.start() #啟動t1線程 t2.start() #啟動t2線程 輸出: t1 is talking t2 is talking
A、通過類的形式調用,舉例如下:
import threading,time class MyThread(threading.Thread): def __init__(self,n): super(MyThread,self).__init__() self.n = n def run(self): print("talking is %s" % self.n) if __name__ == "__main__": t1 = MyThread("t1") t2 = MyThread("t2") t1.start() t2.start() 輸出: talking is t1 talking is t2
B、使用for循環,啟動50個進程:
import threading import time def run(name): #定義要執行的函數 print("%s is talking" % name) time.sleep(2) start_time = time.time() for i in range(50): t = threading.Thread(target=run,args=("t-%s"% i,)) t.start() #主線程 print ("--all threading -----") print ("cost:",time.time() - start_time) #測試執行時間 輸出: ....... t-48 is talking t-49 is talking --all threading ----- cost: 0.008172988891601562
Join函數的使用
Python join() 方法用於將序列中的元素以指定的字符連接生成一個新的字符串。等待第一個執行結果完成,在執行第二個,串行執行。
舉例如下:
import threading import time def run(name): #定義要執行的函數 print("%s is talking" % name) time.sleep(2) start_time = time.time() for i in range(5): t1 = threading.Thread(target=run,args=("t1",)) #生成一個線程 t2 = threading.Thread(target=run,args=("t2",)) #生成另一個通道線程 t1.start() #啟動t1線程 t1.join() #等待第一個線程執行完之後,在執行第二線程,串行。 t2.start() #啟動t2線程 輸出: t1 is talking t2 is talking t1 is talking t2 is talking t1 is talking t2 is talking t1 is talking t2 is talking t1 is talking t2 is talking --all threading ----- cost: 10.020690202713013 註:t1 輸出比較快, t2輸出比較慢。 t2到t1 輸出比較快
上述例子是串行執行,把實力例修改為並行執行。計算50個線程執行的時間。
import threading import time def run(name): #定義要執行的函數 print("%s is talking" % name) time.sleep(2) start_time = time.time() t_jobs = [] for i in range(50): t = threading.Thread(target=run,args=("t-%s"% i,)) t.start() t_jobs.append(t) for t in t_jobs: t.join() #主線程 print ("--all threading -----") print ("cost:",time.time() - start_time) 註:使用兩個for 循環,添加join函數。。達到並行處理底效果。
6、第七周-網絡編程-繼承式多線程