進程,線程
阿新 • • 發佈:2017-07-23
進程終止 mut 啟動 tar 執行方法 進程 關閉 互斥鎖 拷貝 進程,線程
單核cpu一次只能執行一個任務,
電腦運行速度
cpu程序運行:時間片輪訓,調度算法
優先級調度算法
視覺散流:1/24秒
並發和並行:
並行:真正的同時執行多個任務
並發:操作系統就是並發的,看起來是同時執行的
操作系統實現多任務的原理是::
通過調度算法調度任務執行實現多任務
進程的創建---fork() 叉
fork:叉,餐叉,靶,叉起,分叉,分歧
進程:代碼,cpu,內存,磁盤,網絡資源
代碼是程序:運行的程序時進程。
進程是分配資源的最小單位
pid是進程號,pid子進程= 0 父進程返回子進程pid大於0的
方便管理進程
創建完fork()之後,各自執行各自的
對於子進程pid = =0
孤兒進程:父進程先死,子進程再死
僵屍進程:子進程先死,父進程再死
僵屍進程:弊端:僵屍仍然占用資源,麽有釋放。
解決僵屍進程:我們的子進程回收,通過父進程進程回收
os.wait 資源回收,
多進程開發:需要回收子進程資源
獲取pid :getpid():獲取當前進程的pid,getppid():獲取父類pid
fork完成以後資源進行了拷貝,不共享全局變量
fork完成之後,系統調度進行導致,執行流程操作系統說了算,根據現狀,有可能讓子進程先執行也有可能讓父進程先執行
執行無序性:
Process(group【】)
target= 指定繼承要執行的任務
agrs,參數:任務參數
args,是一個
kwargs:調用對象的關鍵字參數字典
name。為當前進程實例的別名
group:大多數情況下用不到,進程分組
Process類常用屬性:
name;
pid:
is_alive:進程死活
join:回收進程資源,默認阻塞 join 必須在terminate之後
terminate:進程終止,不回收資源
總結:
多任務的概念:
多任務的實現原理:通過調度算法實現1,時間輪流,2 ,優先級
並行並發:
並行:一起執行的
並發:看起來是一起執行的,對人來說的,
計算機是怎麽調度任務的:跟換進程任務,通過中斷,來實現
qq,通過中斷,qq中的所有資源,快照,保存狀態,
掛起:執行掛起的,會保存當前的狀態,
fork():創建新的進程:給我們返回兩個值
通過pid返回值來判斷實現多任務的
fork主進程和子進程有設麽關系
fork後的子進程會把主進程的所有資源拷貝(代碼執行狀態)
僵屍進程的危害:僵屍進程會占用系統資源
通過wait回收進程資源,
僵屍進程:子進程死了,主進程沒死,子程序還占有資源
孤兒進程:會丟到1號進程
多進程修改全局變量:多進程資源不共享
多次for問題:依賴fork創建過程
為了便於回收資源,解決方案:只有一個主進程:讓主進程生成
子進程,
multiProcessing
通過process類,
1.導入
2.定義子進程執行方法
3.初始化process對象(args元組最後要加一個,)
4.start啟動我們進程
5.join回收資源(多個子進程回收)
5.join阻塞回收
阻塞超時,如果子進程沒有執行完,就走了,如果執行
process子類
重寫run方法,其它方法和proces方法一樣
進程池pool 隨用隧取,提高了效率
進程多了影響運行效率:
解決辦法:再建一個模塊,實時檢測cpu和進程的運行狀態,動態的
調整
queue==進程間通信----隊列
特點:先進先出
目的:方便進程間管理
pool:1構造進程池(指定進程數量)默認回收,老爹死的時候帶所有兒子
共赴黃泉---join()阻塞等待回收所有的子進程
調用完close()的時候,關閉進程池,不能再添加任務,
進程的通信:queue隊列:
隊列process使用了multiprecess queue
進程池使用manager中的queue
1.創建隊列
2.我的子進程啟動的時候,把隊列傳遞到子進程中
3.A進程--》B進程,創建一個隊列,B-->A再創建一個隊列
queue使用方法:get put最後阻塞等待,2,put_nowait以判斷空或者滿
try捕獲異常
線程部分
1.線程:進程中的代碼流程
進程和線程的區別:
1.進程最小的資源分配單位,線程最小的任務調度單位
2.進程占有獨立的資源,線程共享進程中的資源
3.進程創建和調度開銷大,效率低,線程相反
4.線程依賴於進程,一個進程至少有一個線程
5.全局資源:線程不安全,進程安全
多線程threading
1.創建過程:1定義線程方法
2.實例化線程對象 target,args(,)啟動線程,回收線程,線程的執行順序:無序的,操作系統的調度造成的
2.全局變量:線程共享全局資源,線程之間通信方便,效率高,線程不安全(通過線程同步解決不安全)
3.互斥鎖:
mutex = threading.Lock() 創建鎖
mutex.acquire() 鎖定
mutex.release() 釋放
4.queue實現線程之間的通信,
進程,線程