多進程概念:
進程是程序在計算機上的一次執行活動。當你運行一個程序,你就啓動了一個進程。顯然,程序是死的(靜態的),進程是活的(動態的)。進程可以分爲系統進程和用戶進程。凡是用於完成操作系統的各種功能的進程就是系統進程,它們就是處於運行狀態下的操作系統本身;用戶進程就不必我多講了吧,所有由你啓動的進程都是用戶進程。進程是操作系統進行資源分配的單位。
它的思想簡單介紹如下:在操作系統的管理下,所有正在運行的進程輪流使用CPU,每個進程允許佔用CPU的時間非常短(比如10毫秒),這樣用戶根本感覺不出來CPU是在輪流爲多個進程服務,就好象所有的進程都在不間斷地運行一樣。但實際上在任何一個時間內有且僅有一個進程佔有CPU。
#多進程允許我們充分的利用cpu
多進程和多線程的區別:
多進程使用的是CPU的多個核,適合運算密集型
充分利用多個CPU跑進程,系統執行率會更高
進程的範圍比線程的範圍大,進程是相互獨立的個體,一個進程掛了,不會影響其他進程的使用。
多線程使用的是CPU的一個核,適合IO密集型
線程是屬於進程下面的,線程之間存在共享資源,當一個線程掛了,會導致相關的線程掛掉。
組件:
multiprocess模塊
支持創建子進程,通信,共享數據,執行不同形式的同步,提供Process(創建子進程)、Pipe(管道[默認爲雙向,可以單向])、Lock(進程鎖[當一個進程讀文件,會鎖定不讓其他進程讀,當這個進程讀完,會解開鎖,讓其他進程讀文件])等組件。
多進程 multiprocess模塊方法:
import multiprocessing p = multiprocessing.cpu_count() #統計cpu的個數 m = multiprocessing.active_children() #統計存在的子進程 print (p) print (m)
常用的進程方法:
is_alive() 判斷進程是否存活
run() 啓動進程
start() 啓動進程,會自動調用run方法,這個常用
join(timeout) 等待進程結束或者直到超時
常用的屬性:
name 進程名字
pid 進程的pid
import multiprocessing import time def worker_1(interval): time.sleep(interval) print ("hello world") if __name__ == "__main__": c = multiprocessing.Process(target=worker_1, args=(5,)) #target 代表目標函數名字,沒有括號 #args 代表worker_1所需要的參數,args所接收的參數類型是tuple,單元素要加逗號 c.start() #啓動進程 print (c.is_alive()) #確定進程是否存活 c.join(timeout=1) #等待子進程執行完畢,或者超時退出 print ("end main")
多進程實例:
import time import multiprocessing def worker(name, interval): print ("work {0} start".format(name)) time.sleep(interval) print ("work {0} end".format(name)) if __name__ == "__main__": print ("main start") print ("統計cpu有{0}核").format(multiprocessing.cpu_count()) p1 = multiprocessing.Process(target=worker, args=("worker1", 2)) p2 = multiprocessing.Process(target=worker, args=("worker2", 3)) p3 = multiprocessing.Process(target=worker, args=("worker3", 4)) p1.start() p2.start() p3.start() for p in multiprocessing.active_children(): print ("pid名稱{0},pid號{1}".format(p.name, p.pid)) print("main end")
打印結果:
main start
統計cpu有4核
pid名稱Process-1,pid號6388
pid名稱Process-3,pid號3176
pid名稱Process-2,pid號1268
main end
work worker1 start
work worker3 start ## p1,p2,p3啓動以後都是獨立運行的,先後可以不是順序,有的啓動快,有的啓動慢
work worker2 start
work worker1 end
work worker2 end
work worker3 end ## 關閉進程必須按照啓動的順序P1,P2,P3的順序。