python多線程,多進程編程。
程,是目前計算機中為應用程序分配資源的最小單位;
進程,是目前計算機中運行應用程序的最小單位;
在實際系統中,其實進程都是被分為進程來實現的,所以參與時間片輪轉的是線程;
但是管理應用程序的資源的單位和任務調度的單位都是進程。更像是一個邏輯概念。
線程是進程分出來的更精細的單位,線程間的上下文切換比進程間的上下文切換,要快很多。
多進程與多核,這個概念很奇怪,因為進程是不會直接在核心上運行的。
多線程與多核,涉及一個內核線程與用戶線程的對應關系。
內核線程(Kernel Thread),一般與核心是一一對應的,一個處理核心對應一個內核進程。
目前的計算機,配置一般都是超線程的,即通過硬件冗余,將一個物理核心模擬成兩個邏輯處理核心
對應兩個內核線程。所以在操作系統中看到的CPU是實際物理核心的兩倍。
如雙核四線程,四核八線程
------------------------------------------------------------------------
intel的cpu為了實現分支預測等技術,一般每個內核的運算單元是雙份的,-------超線程
服務器方面的物理核心的運算單位,可能會更多,支持更大的超線程
------------------------------------------------------------------------
用戶線程與內核線程的對應關系:
1) 一一對應,由於內核線程很少,所以限制了很多用戶線程的執行數量;
2) 多對一,用戶線程很慢,影響調度;
3) 多對多,目前應用的模式,
python中的多進程庫,multiprocessing,提供的方法和屬性:
屬性:authkey,daemon(父進程終止後,自動結束子進程,必須在start之前設置),exitcode,name,pid
方法: Process(target,name,args,kwargs),創建進程對象
is_live(),進程狀態
join(‘timeout‘),表示等待後臺的進程運行結束,如果指定timeout,一定時間後,殺掉進程
run(),
start(),
terminate(),
join(),等所有的後臺子進程執行好;
cpu_count(),返回當前擁有的cpu的個數,超線程之後的。
進程創建時,target可以指定為一個函數,也可以直接例化一個進程class。
創建函數process:
創建class進程,start()之後,會自動調用run()函數:
加入daemon屬性:並不會等到該worker的process結束,程序就執行結束了。
多進程遍歷:active_children()
還可以加入lock,semaphore,實現對共享資源的控制,event,進程間通信。
還有進程隊列(Queue),和進程管道(Pipe)
Pool,進程池,不需要自己在管理進程的數量,進程池自動管理。
如果池中的進程數量達到閾值,阻塞其他進程。
參考博客
https://www.cnblogs.com/kaituorensheng/p/4445418.html
python多線程,多進程編程。