一、線程和進程對應的問題
**1.進程:**CPU密集型也叫計算密集型,指的是系統的硬盤、內存性能相對CPU要好很多,此時,系統運作大部分的狀況是CPU Loading 100%,CPU要讀/寫I/O(硬盤/內存),I/O在很短的時間就可以完成,而CPU還有許多運算要處理,CPU Loading很高。
**2.線程:**IO密集型指的是系統的CPU性能相對硬盤、內存要好很多,此時,系統運作,大部分的狀況是CPU在等I/O (硬盤/內存) 的讀/寫操作,此時CPU Loading并不高。
二、進程
定義:進程是程序在某個數據集合上的一次運行活動,也是操作系統進行資源分配和保護的基本單位。
每個進程都有獨立的代碼和數據空間(進程上下文),進程間的切換會有較大的開銷,一個進程包含1–n個線程。(進程是資源分配的最小單位)
CPython解釋器本身就不是線程安全的,因此有全局解釋器鎖(GIL),一次只允許使用一個線程執行Python字節碼。因此,一個Python進程通常不能同時使用多個CPU核心。
Python中的多進程實現:
futures.ProcessPoolExecutor類。現在流行multiprocessing模塊。
import multiprocessing# 定義一個函數,用于在多個進程中執行任務
def worker_function(index):print(f"Worker {index} started")result = index * 2print(f"Worker {index} result: {result}")print(f"Worker {index} finished")if __name__ == "__main__":# 創建一個進程池,可以指定要創建的進程數(這里為3)num_processes = 3pool = multiprocessing.Pool(processes=num_processes)# 使用進程池執行任務# 這里將任務分配給三個進程并行執行pool.map(worker_function, range(num_processes))# 關閉進程池,等待所有進程完成pool.close()pool.join()print("All workers have finished")
還有一種更簡單的,使用
https://zhuanlan.zhihu.com/p/509084322
三、線程
進程中的一個執行任務(控制單元),負責當前進程中程序的執行。一個進程至少有一個線程,一個進程可以運行多個線程,多個線程可共享數據。
線程和進程都具有一砂鍋五個狀態。
Python中的實現:
import threading# 定義一個函數,用于在線程中執行任務
def worker_function(thread_id):print(f"Thread {thread_id} started")# 在這里可以執行一些任務print(f"Thread {thread_id} finished")if __name__ == "__main__":# 創建多個線程num_threads = 3threads = []for i in range(num_threads):thread = threading.Thread(target=worker_function, args=(i,))threads.append(thread)# 啟動所有線程for thread in threads:thread.start()# 等待所有線程完成for thread in threads:thread.join()print("All threads have finished")
四、二者的區別
多進程和多線程都是用于并發編程的技術,但它們有一些共性和區別:
共性:
-
并發性: 無論是多進程還是多線程,它們都允許在程序中執行多個任務,并在不同的執行上下文中交替執行這些任務,從而實現并發性。
-
共享資源: 多進程和多線程都可以訪問共享的內存資源,這允許多個任務之間進行數據交換和共享數據。
-
并行執行: 在多核或多 CPU 的系統上,多進程和多線程都可以實現真正的并行執行,從而提高程序的性能。
區別:
-
獨立性:
- 多進程:每個進程都有獨立的內存空間和 Python 解釋器,它們之間彼此獨立,因此一個進程的錯誤通常不會影響其他進程。
- 多線程:所有線程共享同一進程的內存空間,它們之間共享全局變量和數據。因此,一個線程的錯誤可能會影響其他線程和整個進程。
-
創建和銷毀:
- 多進程:創建和銷毀進程通常比較慢,并且需要更多的系統資源,因為每個進程都有獨立的內存空間。
- 多線程:創建和銷毀線程通常更快,因為它們共享進程的內存空間,但線程之間的管理和同步可能更復雜。
-
并發性和并行性:
- 多進程:可以在多個 CPU 上并行執行,因此適用于 CPU 密集型任務。然而,多進程之間的通信開銷相對較高。
- 多線程:在單個 CPU 上的并發性較強,適用于 I/O 密集型任務,但由于 GIL 的存在,多線程不能實現真正的多核并行。
-
同步和鎖:
- 多進程:通常需要使用進程間通信(Inter-Process Communication,IPC)機制來實現進程之間的協作,例如管道、隊列和共享內存。
- 多線程:線程之間可以更容易地共享數據,但需要使用鎖(例如互斥鎖)來確保線程安全。
-
資源開銷:
- 多進程:通常比多線程消耗更多的內存和系統資源。
- 多線程:相對較輕量,消耗的資源較少。