1. 程式人生 > 實用技巧 >執行緒 Thread

執行緒 Thread

執行緒 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)