Python进程学习笔记-multiprocessing模块
如果你打算編寫多進(jìn)程的服務(wù)程序,Unix/Linux無(wú)疑是正確的選擇。由于Windows沒(méi)有fork調(diào)用,難道在Windows上無(wú)法用Python編寫多進(jìn)程的程序?
由于Python是跨平臺(tái)的,自然也應(yīng)該提供一個(gè)跨平臺(tái)的多進(jìn)程支持。multiprocessing模塊就是跨平臺(tái)版本的多進(jìn)程模塊。
multiprocessing模塊提供了一個(gè)Process類來(lái)代表一個(gè)進(jìn)程對(duì)象,下面的例子演示了啟動(dòng)一個(gè)子進(jìn)程并等待其結(jié)束:
#coding=utf-8 from multiprocessing import Process import os# 子進(jìn)程要執(zhí)行的代碼 def run_proc(name):print('子進(jìn)程運(yùn)行中,name= %s ,pid=%d...' % (name, os.getpid()))if __name__=='__main__':print('父進(jìn)程 %d.' % os.getpid())p = Process(target=run_proc, args=('test',))print('子進(jìn)程將要執(zhí)行')p.start()p.join()print('子進(jìn)程已結(jié)束')?
運(yùn)行結(jié)果:
父進(jìn)程 13227.
子進(jìn)程將要執(zhí)行
子進(jìn)程運(yùn)行中,name= test ,pid=13228, ppid=13227
子進(jìn)程已結(jié)束
?
說(shuō)明
- 創(chuàng)建子進(jìn)程時(shí),只需要傳入一個(gè)執(zhí)行函數(shù)和函數(shù)的參數(shù),創(chuàng)建一個(gè)Process實(shí)例,用start()方法啟動(dòng),這樣創(chuàng)建進(jìn)程比f(wàn)ork()還要簡(jiǎn)單。
- join()方法可以等待子進(jìn)程結(jié)束后再繼續(xù)往下運(yùn)行,通常用于進(jìn)程間的同步。
Process語(yǔ)法結(jié)構(gòu)如下:
Process([group [, target [, name [, args [, kwargs]]]]])
-
target:表示這個(gè)進(jìn)程實(shí)例所調(diào)用對(duì)象;
-
args:表示調(diào)用對(duì)象的位置參數(shù)元組;
-
kwargs:表示調(diào)用對(duì)象的關(guān)鍵字參數(shù)字典;
-
name:為當(dāng)前進(jìn)程實(shí)例的別名;
-
group:大多數(shù)情況下用不到;
Process類常用方法:
-
is_alive():判斷進(jìn)程實(shí)例是否還在執(zhí)行;
-
join([timeout]):是否等待進(jìn)程實(shí)例執(zhí)行結(jié)束,或等待多少秒;
-
start():啟動(dòng)進(jìn)程實(shí)例(創(chuàng)建子進(jìn)程);
-
run():如果沒(méi)有給定target參數(shù),對(duì)這個(gè)對(duì)象調(diào)用start()方法時(shí),就將執(zhí)行對(duì)象中的run()方法;
-
terminate():不管任務(wù)是否完成,立即終止;
Process類常用屬性:
-
name:當(dāng)前進(jìn)程實(shí)例別名,默認(rèn)為Process-N,N為從1開(kāi)始遞增的整數(shù);
-
pid:當(dāng)前進(jìn)程實(shí)例的PID值;
?
實(shí)例1
from multiprocessing import Process import os from time import sleep# 子進(jìn)程要執(zhí)行的代碼 def run_proc(name, age, **kwargs):for i in range(10):print('子進(jìn)程運(yùn)行中,name= %s,age=%d ,pid=%d...' % (name, age,os.getpid()))print(kwargs)sleep(0.5)if __name__=='__main__':print('父進(jìn)程 %d.' % os.getpid())p = Process(target=run_proc, args=('test',18), kwargs={"m":20})print('子進(jìn)程將要執(zhí)行')p.start()sleep(1)p.terminate()p.join()print('子進(jìn)程已結(jié)束')運(yùn)行結(jié)果:
父進(jìn)程 21378. 子進(jìn)程將要執(zhí)行 子進(jìn)程運(yùn)行中,name= test,age=18 ,pid=21379... {'m': 20} 子進(jìn)程運(yùn)行中,name= test,age=18 ,pid=21379... {'m': 20} 子進(jìn)程已結(jié)束?
實(shí)例2
#coding=utf-8 from multiprocessing import Process import time import os#兩個(gè)子進(jìn)程將會(huì)調(diào)用的兩個(gè)方法 def worker_1(interval):print("worker_1,父進(jìn)程(%s),當(dāng)前進(jìn)程(%s)"%(os.getppid(),os.getpid()))t_start = time.time()time.sleep(interval) #程序?qū)?huì)被掛起interval秒t_end = time.time()print("worker_1,執(zhí)行時(shí)間為'%0.2f'秒"%(t_end - t_start))def worker_2(interval):print("worker_2,父進(jìn)程(%s),當(dāng)前進(jìn)程(%s)"%(os.getppid(),os.getpid()))t_start = time.time()time.sleep(interval)t_end = time.time()print("worker_2,執(zhí)行時(shí)間為'%0.2f'秒"%(t_end - t_start))#輸出當(dāng)前程序的ID print("進(jìn)程ID:%s"%os.getpid())#創(chuàng)建兩個(gè)進(jìn)程對(duì)象,target指向這個(gè)進(jìn)程對(duì)象要執(zhí)行的對(duì)象名稱, #args后面的元組中,是要傳遞給worker_1方法的參數(shù), #因?yàn)閣orker_1方法就一個(gè)interval參數(shù),這里傳遞一個(gè)整數(shù)2給它, #如果不指定name參數(shù),默認(rèn)的進(jìn)程對(duì)象名稱為Process-N,N為一個(gè)遞增的整數(shù) p1=Process(target=worker_1,args=(2,)) p2=Process(target=worker_2,name="dongGe",args=(1,))#使用"進(jìn)程對(duì)象名稱.start()"來(lái)創(chuàng)建并執(zhí)行一個(gè)子進(jìn)程, #這兩個(gè)進(jìn)程對(duì)象在start后,就會(huì)分別去執(zhí)行worker_1和worker_2方法中的內(nèi)容 p1.start() p2.start()#同時(shí)父進(jìn)程仍然往下執(zhí)行,如果p2進(jìn)程還在執(zhí)行,將會(huì)返回True print("p2.is_alive=%s"%p2.is_alive())#輸出p1和p2進(jìn)程的別名和pid print("p1.name=%s"%p1.name) print("p1.pid=%s"%p1.pid) print("p2.name=%s"%p2.name) print("p2.pid=%s"%p2.pid)#join括號(hào)中不攜帶參數(shù),表示父進(jìn)程在這個(gè)位置要等待p1進(jìn)程執(zhí)行完成后, #再繼續(xù)執(zhí)行下面的語(yǔ)句,一般用于進(jìn)程間的數(shù)據(jù)同步,如果不寫這一句, #下面的is_alive判斷將會(huì)是True,在shell(cmd)里面調(diào)用這個(gè)程序時(shí) #可以完整的看到這個(gè)過(guò)程,大家可以嘗試著將下面的這條語(yǔ)句改成p1.join(1), #因?yàn)閜2需要2秒以上才可能執(zhí)行完成,父進(jìn)程等待1秒很可能不能讓p1完全執(zhí)行完成, #所以下面的print會(huì)輸出True,即p1仍然在執(zhí)行 p1.join() print("p1.is_alive=%s"%p1.is_alive())執(zhí)行結(jié)果:
進(jìn)程ID:19866 p2.is_alive=True p1.name=Process-1 p1.pid=19867 p2.name=dongGe p2.pid=19868 worker_1,父進(jìn)程(19866),當(dāng)前進(jìn)程(19867) worker_2,父進(jìn)程(19866),當(dāng)前進(jìn)程(19868) worker_2,執(zhí)行時(shí)間為'1.00'秒 worker_1,執(zhí)行時(shí)間為'2.00'秒 p1.is_alive=False?
轉(zhuǎn)載于:https://www.cnblogs.com/Paul-watermelon/articles/9724588.html
總結(jié)
以上是生活随笔為你收集整理的Python进程学习笔记-multiprocessing模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: office2016 + visio20
- 下一篇: 原来你是这样的Promise