1.線程進程進程:程式並不能單獨運行,只有將程式裝載到記憶體中,系統為它分配資源才能運行,而這種執行的程式就稱之為進程,不具備執行感念,只是程式各種資源集合 線程:線程是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中 ...
1.線程進程
進程:程式並不能單獨運行,只有將程式裝載到記憶體中,系統為它分配資源才能運行,而這種執行的程式就稱之為進程,不具備執行感念,只是程式各種資源集合
線程:線程是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發多個線程,每條線程並行執行不同的任務
2.線程與進程的區別
線程共用記憶體空間, 進程的記憶體是獨立的
線程共用創建它的進程的地址空間; 進程擁有自己的地址空間。
線程可以直接訪問其進程的數據段; 進程擁有父進程的數據段的自己的副本。
線程可以直接與其進程的其他線程通信; 進程必須使用進程間通信與兄弟進程進行通信。
新線程很容易創建; 新流程需要重覆父流程。
線程可以對同一進程的線程進行相當程度的控制; 進程只能對子進程進行控制。
對主線程的更改(取消,優先順序更改等)可能會影響進程其他線程的行為; 對父進程的更改不會影響子進程。
3.一條線程至少有一條線程
4.線程鎖
每個線程在要修改公共數據時,為了避免自己在還沒改完的時候別人也來修改此數據,可以給這個數據加一把鎖, 這樣其它線程想修改此數據時就必須等待你修改完畢並把鎖釋放掉後才能再訪問此數據
5.Semaphore(信號量)
互斥鎖 同時只允許一個線程更改數據,而Semaphore是同時允許一定數量的線程更改數據 ,比如廁所有3個坑,那最多只允許3個人上廁所,後面的人只能等裡面有人出來了才能再進去。
6.join的作用是 等待線程執行完畢
7.練習
信號量
__author__ = "Narwhale" import threading,time def run(n): semaphore.acquire() time.sleep(1) print('線程%s在跑!'%n) semaphore.release() if __name__ == '__main__': semaphore = threading.BoundedSemaphore(5) #最多5個線程同時跑 for i in range(20): t = threading.Thread(target=run,args=(i,)) t.start() while threading.active_count() !=1: pass else: print('所有線程跑完了!')
生產者消費者模型
__author__ = "Narwhale" import queue,time,threading q = queue.Queue(10) def producer(name): count = 0 while True: print('%s生產了包子%s'%(name,count)) q.put('包子%s'%count) count += 1 time.sleep(1) def consumer(name): while True: print('%s取走了%s,並且吃了它。。。。。'%(name,q.get())) time.sleep(1) A1 = threading.Thread(target=producer,args=('A1',)) A1.start() B1 = threading.Thread(target=consumer,args=('B1',)) B1.start() B2 = threading.Thread(target=consumer,args=('B2',)) B2.start()
紅綠燈
__author__ = "Narwhale" import threading,time event = threading.Event() def light(): event.set() count = 0 while True: if count >5 and count < 10: event.clear() print('\033[41;1m紅燈亮了\033[0m' ) elif count > 10: event.set() count = 0 else: print('\033[42;1m綠燈亮了\033[0m') time.sleep(1) count +=1 def car(n): while True: if event.isSet(): print('\033[34;1m%s車正在跑!\033[0m'%n) time.sleep(1) else: print('車停下來了') event.wait() light = threading.Thread(target=light,args=( )) light.start() car1 = threading.Thread(target=car,args=('Tesla',)) car1.start()