進程:資源單位python
線程:執行單位安全
線程與進程都是虛擬的概念,爲了更好的表達某種事物app
注意:開啓一個進程,必定會自帶一個線程,線程纔是真正的執行者ui
節省資源的佔用線程
開啓進程:code
一、產生一個內存空間,申請一塊資源對象
二、會自帶一個主線程進程
三、開啓子進程的速度要比開啓子線程的速度慢內存
開啓線程:資源
一、一個進程內能夠開啓多個線程,從進程的內存空間中申請執行單位
二、節省資源
開啓幾個進程就會開闢幾個內存空間,開闢幾個線程是在同一個內存空間中申請幾個執行單位
同進程的使用類似,調用的是Thread生成對象obj,經過obj.start()開啓線程
from threading import Thread import time # 方式1:直接調用 num = 100 def task(): global num num = 200 print('開啓子線程') time.sleep(1) print('子線程結束') if __name__ == '__main__': t = Thread(target=task) t.start() print('主進程(主線程)結束') # 子線程要比子進程開啓快 # 開啓子線程 # 主進程(主線程)結束 # 子線程結束
from threading import Thread import time num = 10 # 方式2:定義類,並重寫run方法 class Mythread(Thread): # 重寫run方法 def run(self): print('開啓子線程') time.sleep(1) print('子線程結束') if __name__ == '__main__': t = Mythread() # 建立子線程 t.start() # 讓子線程結束後主進程才結束 t.join() print('主進程(主線程)結束') # 開啓子線程 # 子線程結束 # 主進程(主線程)結束
當主線程結束後,子線程也當即結束,並回收,經過 obj.daemon = True 定義在obj.start() 以前設置
from threading import Thread # 當前線程 from threading import current_thread import time num = 10 def task(): global num num = 20 print('開啓子線程') time.sleep(1) print('子線程結束') if __name__ == '__main__': t = Thread(target=task) t.daemon = True t.start() # current_thread().name查看當前線程名 print(f'主進程(主線程)結束{current_thread().name}') # 開啓子線程 # 主進程(主線程)結束MainThread
互斥鎖是用來保證數據讀寫安全的,在修改同一個數據時,同一時間只能有一個任務能夠進行修改,即串行的修改,保證數據安全
from threading import Thread from threading import Lock import time lock = Lock() num = 10 def task(): global num lock.acquire() time.sleep(1) num += 1 lock.release() if __name__ == '__main__': list1 = [] for i in range(10): t = Thread(target=task) t.start() list1.append(t) for t in list1: t.join() print(num) # 20
每個線程的從生成到消亡也是須要時間和資源的,太多的線程會佔用過多的系統資源(內存開銷,cpu開銷),並且生成太多的線程也是須要時間的,極可能會得不償失 ,線程池是用來限制每次線程的數量
from concurrent.futures import ThreadPoolExecutor import time # 每次線程的數量爲10 pool = ThreadPoolExecutor(10) def task(line): print(line) time.sleep(5) if __name__ == '__main__': for line in range(100): pool.submit(task, line)