執行緒 Thread
阿新 • • 發佈:2020-07-26
執行緒 Thread
執行緒 :能被作業系統排程(給CPU執行)的最小單位
資料共享,作業系統排程的最小單位,可以利用多核,作業系統排程,資料不安全,開啟關閉切換時間開銷小
在CPython中的多執行緒 - 節省io操作的時間
gc 垃圾回收機制 執行緒
引用計數 +分代回收
全域性直譯器鎖的出現主要是為了完成gc的回收機制,對不同執行緒的引用計數的變化記錄的更加精準
全域性直譯器鎖 GIL(global interpreter lock)
導致了同一個程序中的多個執行緒只能有一個執行緒真正被cpu執行
節省的是io操作的時間,而不是cpu計算的時間,因為cpu的計算速度非常快,大部分情況下,我們沒有辦法把一條程序中所有的io操作都規避掉
import os import time from threading import Thread,current_thread,enumerate,active_count # # from multiprocessing import Process as Thread def func(i): print('start%s'%i,current_thread().ident) time.sleep(1) print('end%s'%i) if __name__ == '__main__': tl = [] for i in range(10): t = Thread(target=func,args=(i,)) t.start() print(t.ident,os.getpid()) tl.append(t) print(enumerate(),active_count()) for t in tl:t.join() print('所有的執行緒都執行完了') # current_thread() 獲取當前所在的執行緒的物件 current_thread().ident通過ident可以獲取執行緒id # 執行緒是不能從外部terminate 關閉 # 所有的子執行緒只能是自己執行完程式碼之後就關閉 # enumerate 列表 儲存了所有活著的執行緒物件,包括主執行緒 # active_count 數字 儲存了所有活著的執行緒個數
# 面向物件的方式起執行緒
from threading import Thread
class MyThread(Thread):
def __init__(self,a,b):
self.a = a
self.b = b
super().__init__()
def run(self):
print(self.ident)
t = MyThread(1,2)
t.start() # 開啟執行緒 才在執行緒中執行run方法
print(t.ident)
# 執行緒之間的資料的共享 from threading import Thread n = 100 def func(): global n n -= 1 t_l = [] for i in range(100): t = Thread(target=func) t.start() t_l.append(t) for t in t_l: t.join() print(n)