content: 1. 為什麼要多進程編程?和多線程有什麼區別? 2. python 多進程編程 3. 進程間通信 一. 為什麼要多進程編程?和多線程有什麼區別? 由於GIL的存在,所以對於某一些多線程任務來說,無法利用多核的優勢,對這些耗cpu的任務,用多進程反而能利用多cpu。 所以多cpu的操 ...
content: 1. 為什麼要多進程編程?和多線程有什麼區別? 2. python 多進程編程 3. 進程間通信 ======================================= 一. 為什麼要多進程編程?和多線程有什麼區別? 由於GIL的存在,所以對於某一些多線程任務來說,無法利用多核的優勢,對這些耗cpu的任務,用多進程反而能利用多cpu。 所以多cpu的操作用多進程編程。 對io操作較多的任務來說,瓶頸不在於cpu,更多的在於io的切換中的消耗和時間等待。用多線程反而能在io掛起的時候,進行線程切換。 雖然io操作多的時候,也可以用多進程編程,但是因為進程的切換系統的代價是十分大的,所以能使用多線程的情況下,儘量用多線程。 所以,對於耗費cpu的操作,比如計算、挖礦等,多進程優於多線程。 例:同計算一組斐波拉契數列的時間比較(耗cpu的操作)
#多線程 from concurrent.futures import ThreadPoolExecutor,as_completed from concurrent.futures import ProcessPoolExecutor import time def fib(n): if n <= 2: return 1 return fib(n-1)+fib(n-2) with ThreadPoolExecutor(3) as excutor: all_task=[excutor.submit(fib,(num)) for num in range(25,35)] start_time=time.time() for future in as_completed(all_task): data=future.result() print("result:{}".format(data)) end_time=time.time() print("last time : {}".format(end_time-start_time)) #output: result:75025 result:121393 result:196418 result:317811 result:514229 result:832040 result:1346269 result:2178309 result:3524578 result:5702887 last time : 98.66604399681091
#多進程 from concurrent.futures import ThreadPoolExecutor,as_completed from concurrent.futures import ProcessPoolExecutor import time def fib(n): if n <= 2: return 1 return fib(n-1)+fib(n-2) if __name__ == "__main__": with ProcessPoolExecutor(3) as excutor: all_task = [excutor.submit(fib, (num)) for num in range(25, 35)] start_time = time.time() for future in as_completed(all_task): data = future.result() print("result:{}".format(data)) end_time = time.time() print("last time : {}".format(end_time - start_time)) #output: result:75025 result:121393 result:196418 result:317811 result:514229 result:832040 result:1346269 result:2178309 result:3524578 result:5702887 last time : 14.470988988876343
進程和線程的區別:
- 進程是資源分配的最小單位,線程是程式執行的最小單位。
- 進程有自己的獨立地址空間,每啟動一個進程,系統就會為它分配地址空間,建立數據表來維護代碼段、堆棧段和數據段,這種操作非常昂貴。而線程是共用進程中的數據的,使用相同的地址空間,因此CPU切換一個線程的花費遠比進程要小很多,同時創建一個線程的開銷也比進程要小很多。
- 線程之間的通信更方便,同一進程下的線程共用全局變數、靜態變數等數據,而進程之間的通信需要以通信的方式(IPC)進行。不過如何處理好同步與互斥是編寫多線程程式的難點。
- 但是多進程程式更健壯,多線程程式只要有一個線程死掉,整個進程也死掉了,而一個進程死掉並不會對另外一個進程造成影響,因為進程有自己獨立的地址空間。