36. Python 多進程
進程是程序在計算機上的一次執行活動。當你運行一個程序,你就啟動了一個進程。顯然,程序是死的(靜態的),進程是活的(動態的)。進程可以分為系統進程和用戶進程。凡是用於完成操作系統的各種功能的進程就是系統進程,它們就是處於運行狀態下的操作系統本身;用戶進程就不必我多講了吧,所有由你啟動的進程都是用戶進程。進程是操作系統進行資源分配的單位。
它的思想簡單介紹如下:在操作系統的管理下,所有正在運行的進程輪流使用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的順序。
36. Python 多進程