進程線程協程
阿新 • • 發佈:2018-10-03
+= 屬於 阻塞 manage 調度 -i 每次 單元 pre
進程是系統進行資源分配和調度的一個獨立單位,每個進程都有自己獨立的內存空間,不同進程通過進程間通信來通信
線程
線程是進程的一個實體,是CPU調度和分配的基本單位,可與同屬於一個進程的其他線程共享進程所擁有的全部資源
協程
協程是一種用戶態的輕量級線程,協程的調度完全由用戶控制
進程與線程區別
線程是指進程內的最小執行單元,也是進程內的可調度實體
-
地址空間:線程是進程內的一個執行單元,進程內至少有一個線程,他們共享進程的地址空間,而進程有自己獨立的地址空間
-
資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
-
二者均可並發執行
協程與線程
-
一個線程可以有多個協程
-
線程進程都是同步機制,協程是異步
-
協程能保留上一次的狀態,每次過程重入時,就相當於進入上一次調用的狀態
進程線程協程在python中的作用
-
多進程一般使用multiprocessing庫,來利用多核CPU,主要用在CPU密集型的程序上,生產者消費者也可以使用。多進程的優勢是一個子進程崩潰並不影響其他子進程和和主進程的運行,缺點是不能一次性啟動太多進程,會嚴重影響系統的資源調度,特別是CPU使用率和負載
-
多線程使用threading庫,完成一些IO密集型並發操作。多線程的優勢是切換快,資源消耗低,但一個線程掛掉會影響到所用線程,所以不穩定,一般使用線程池
-
協程一般使用gevent庫,多用在web方向是
-
IO密集型一般使用多線程或者多進程,CPU密集型一般使用多進程,強調非阻塞異步並發的一般使用協程
1 import multiprocessing 2 import time 3 4 5 def func_1(name): 6 print("hello", name) 7 time.sleep(2) 8 9 10 def func_2(): 11 print("你好!") 12 time.sleep(2) 13 14 15 pro1 = multiprocessing.Process(target=func_1, args=("進程gkl", )) 16 pro1.start() 17 func_2()
你好!
hello gkl
1 import multiprocessing # 導入多進程模塊 2 3 4 mar = multiprocessing.Manager() # 創建一個進程空間,並返回與其通信的管理器 5 mar_list = mar.list() # 通過管理器在服務器進程中開辟一個列表空間,並返回一個代理 6 mar_list.append("天氣不錯!!!") # 導入數據 方法和列表一致 7 print(mar_list) 8 9 10 def sub_process(li): 11 li.append("今天星期二") 12 13 14 # 把代理傳給子進程,子進程就可以通過這個代理來操作共享空間進行通信 15 pro = multiprocessing.Process(target=sub_process, args=(mar_list, )) 16 pro.start() # 運行 17 pro.join() # 阻塞 等待子進程完成後繼續運行 18 print(mar_list)進程間通信
[‘天氣不錯!!!‘] [‘天氣不錯!!!‘, ‘今天星期二‘]
1 import threading 2 3 4 data = 0 5 lock = threading.Lock() # 創建一把鎖 防止計算混亂 同一進程下的線程共享變量,容易發生紊亂 6 7 8 def add(): 9 global data 10 for i in range(100000): 11 with lock: # 鎖 (加鎖、釋放鎖) 12 data += 1 13 14 15 def sub(): 16 global data 17 for i in range(100000): 18 with lock: 19 data -= 1 20 21 22 add_td = threading.Thread(target=add) 23 add_td.start() 24 sub_td = threading.Thread(target=sub) 25 sub_td.start() 26 add_td.join() 27 sub_td.join() 28 print(data)線程間通信
運行結果為0
進程線程協程