1. 程式人生 > >6、第七周-網絡編程-繼承式多線程

6、第七周-網絡編程-繼承式多線程

重入 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()

線程調用的方法有兩種:

1、直接調用

使用函數的方式進行調用:

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
2、繼承式多線程

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、第七周-網絡編程-繼承式多線程