1. 程式人生 > >36. Python 多進程

36. Python 多進程

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 多進程