網路程式設計 之執行緒
阿新 • • 發佈:2019-01-02
# 程序都預設擁有一條主執行緒,執行緒相當於流水線,程序相當於車間.
#什麼是執行緒:程式的執行線路,相當於一條流水線,其包含了程式的具體執行步驟.
# 程序中包含了執行該程式需要的所有資源,程序是資源單位,執行緒是cpu的最小執行單位
# 程序包含執行緒而執行緒依賴於程序
# 程序對系統的資源消耗非常的高
# 多執行緒可以讓cpu在一個程序內切換,從而提高cpu佔用率
二 .開啟多執行緒的兩種方式 對比多程序實際是一樣的方式
1.例項化Thread
2.繼承Thread類 覆蓋 run方法
from threading import Thread
def task():
print('threading running')
t1 = Thread(target = task,)
t1.staet()
print('over')
第二:繼承
class MyThread(Thread):
def run(self):
print('子執行緒running')
MyThread().start()
print('over')
三:
什麼情況下開啟多執行緒
當程式中遇到IO操作的時候
當程式中是純計算任務,即使開多執行緒也無法提高效率
程序和執行緒的區別:
1.所有的同一個程序內的執行緒共享這個程序中的所有資料資源
2.程序對於作業系統的資源消耗非常高,而執行緒比較低大概的倍數10-100倍
例子:
100個執行緒和100個程序開啟時間的對比:
from multiprocessing import Process from threading import Thread import time def task(): pass 100個程序時間統計 if __name__ == '__main__': start= time.time() ps=[] for i in range(100): p = Process(target=task) p.start() ps.append(p) for p in ps: p.join()print(time.time()-start) 100個執行緒時間 start= time.time() ts = [] for i in range(100): t = Thread(target=task) t.start() ts.append(t) for t in ts: t.join() print(time.time()-start)
執行緒中的一些常規使用屬性
# from threading import enumerate,current_thread,active_count
# 獲取所有執行緒物件列表 print(enumerate())
# 獲取當前執行緒 print(current_thread())
# 獲取當前正在進行的執行緒個數 print(active_count())
四:執行緒互斥鎖
import time from threading import Thread,Lock lock = Lock() a =100 def task(): lock.acquire() global a temp = a - 1 time.sleep(0.01) a = temp lock.release() ts = [] for i in range(100): t = Thread(target=task) t.start() ts.append(t) 將程序物件加入列表 for t in ts : 迴圈列表中的程序為其新增join 讓主執行緒等待其他子執行緒全部執行完後再執行 t.join() print(a)
五.訊號量
其實也是一種鎖,特點是可以設定一個數據被多個執行緒(程序共享)
對比普通鎖的區別:
普通鎖: 一旦加鎖則意味著.這個資料只能被同時一個人使用,訊號量可以在同一個時間被多個執行緒使用
作用可以防止資料被同時訪問過載,限制訪問的執行緒個數
from threading import Semaphore,Thread,current_thread import time,random sem = Semaphore(3) #設定同時可以多少個執行緒訪問資料執行 def task(): sem.acquire() print('%s run.....'%current_thread()) time.sleep(3) #3個執行緒一批的執行 sem.release() for i in range(10): t = Thread(target=task) t.start()