這是第二篇關(guān)于多進程的文章,上一篇文章簡單介紹了多進程在Python中簡單的應(yīng)用,以一個累加的例子簡單說明了主要的應(yīng)用邏輯,這篇文章里我們簡單介紹一下multiprocessing包中的一個重要的一個進程管理工具Process。Process可以用來管理一個進程,比如你想讓一個函數(shù)運行,這兩次同時運行,而不是依次的運行,簡單例子如下:
from multiprocessing import Pool, Process
def f(name):
"""定義一個簡單的打印名字的函數(shù)"""
print('hello:', name)
if __name__ == '__main__':
p1 = Process(target=f, args=('boy',)) # 使用Process建立一個進程
print("cut") # 我們在這里打一個斷點來看看進程運行的順序
p2 = Process(target=f, args=('girl',)) # 使用Process建立第二個進程
p1.start() # 開始第一個進程
p2.start() # 開始第二個進程
p1.join() # 關(guān)閉進程
p2.join() # 關(guān)閉進程
運行結(jié)果:
cut
hello: boy
hello: girl
我們根據(jù)上面的結(jié)果可以看到,每一個進程我們都可以使用Process來進行管理,例子中Process的參數(shù)第一個target=f,f代表你要引用函數(shù)的函數(shù)名稱,注意這里時不用添加括號的,不能寫成f(),args=("boy",)表示函數(shù)需要的參數(shù),要使用元組的形式。
Process的具體參數(shù)如下:
Process([group [, target [, name [, args [, kwargs]]]]])
group: 線程組,目前還沒有實現(xiàn),庫引用中提示必須是None;
target: 要執(zhí)行的方法;
name: 進程名;
args: 要傳入方法的參數(shù)。
另外Process不但有start和join的類方法,還有其他的方法,我們簡單介紹如下:
.is_alive():返回進程是否在運行。
.join([timeout]):阻塞當(dāng)前上下文環(huán)境的進程程,直到調(diào)用此方法的進程終止或到達指定的timeout(可選參數(shù))。
.start():進程準(zhǔn)備就緒,等待CPU調(diào)度。
.run():start()調(diào)用run方法,如果實例進程時未制定傳入target,這start執(zhí)行默認(rèn)run()方法。
.terminate():不管任務(wù)是否完成,立即停止工作進程
在上面的程序里我們只使用了.start()和.join()兩個較為常用的方法。上面的例子中我們只使用了兩個進程我們可以一個一個的寫,如果一次要寫幾十個或是上百個進程時還是用這種方式就顯得不是很優(yōu)雅了,我們可以使用for循環(huán)來建立我們的進程,先看看代碼實現(xiàn),我再來解釋:
from multiprocessing import Pool, Process
def f(name):
"""定義一個簡單的打印名字的函數(shù)"""
print('hello:', name)
if __name__ == '__main__':
name_list = ["小飛", "小倩", "是不是淘氣", "二妞"]
Process_list = []
for value in name_list:
Process_list.append(Process(target=f, args=(value,)))
for one_process in Process_list:
one_process.start()
for one_process in Process_list:
one_process.join()
運行結(jié)果:
hello: 小倩
hello: 小飛
hello: 是不是淘氣
hello: 二妞
按照上面的程序,我們使用了三個for循環(huán)對四個進程進行統(tǒng)一的管理,進程之間同時運行。我們建立了一個列表name_list用來存放每個進程的輸入,建立一個Process_list用來存放我們建立的進程,列表中的每一個元素都是一個進程,后面我們再來遍歷這個Process_list來對其中的進程進行管理,我們可以將這個列表打印出來如下:
[<Process(Process-1, initial)>, <Process(Process-2, initial)>, <Process(Process-3, initial)>, <Process(Process-4, initial)>]
看到了列表中都是進程對象,這樣我們就一下對多個進程進行了統(tǒng)一的管理。
下一篇文章我們來詳細介紹一下Pool的應(yīng)用,可以接受函數(shù)返回值的功能。