想要充分利用多核CPU資源,Python中大部分情況下都需要使用多進(jìn)程,Python中提供了multiprocessing這個包實(shí)現(xiàn)多進(jìn)程。multiprocessing支持子進(jìn)程、進(jìn)程間的同步與通信,提供了Process、Queue、Pipe、Lock等組件。
開辟子進(jìn)程
multiprocessing中提供了Process類來生成進(jìn)程實(shí)例
Process([group [, target [, name [, args [, kwargs]]]]])
先來個小例子:
# -*- coding:utf-8 -*-from multiprocessing import Process, Poolimport osimport timedef run_proc(wTime): n = 0 while n < 3: print "subProcess %s run," % os.getpid(), "{0}".format(time.ctime()) #獲取當(dāng)前進(jìn)程號和正在運(yùn)行是的時間 time.sleep(wTime) #等待(休眠) n += 1if __name__ == "__main__": p = Process(target=run_proc, args=(2,)) #申請子進(jìn)程 p.start() #運(yùn)行進(jìn)程 print "Parent process run. subProcess is ", p.pid print "Parent process end,{0}".format(time.ctime())運(yùn)行結(jié)果:
Parent process run. subProcess is 30196
Parent process end,Mon Mar 27 11:20:21 2017
subProcess 30196 run, Mon Mar 27 11:20:21 2017
subProcess 30196 run, Mon Mar 27 11:20:23 2017
subProcess 30196 run, Mon Mar 27 11:20:25 2017
根據(jù)運(yùn)行結(jié)果可知,父進(jìn)程運(yùn)行結(jié)束后子進(jìn)程仍然還在運(yùn)行,這可能造成僵尸( zombie)進(jìn)程。
通常情況下,當(dāng)子進(jìn)程終結(jié)時,它會通知父進(jìn)程,清空自己所占據(jù)的內(nèi)存,并在內(nèi)核里留下自己的退出信息。父進(jìn)程在得知子進(jìn)程終結(jié)時,會從內(nèi)核中取出子進(jìn)程的退出信息。但是,如果父進(jìn)程早于子進(jìn)程終結(jié),這可能造成子進(jìn)程的退出信息滯留在內(nèi)核中,子進(jìn)程成為僵尸(zombie)進(jìn)程。當(dāng)大量僵尸進(jìn)程積累時,內(nèi)存空間會被擠占。
有什么辦法可以避免僵尸進(jìn)程呢?
這里介紹進(jìn)程的一個屬性 deamon,當(dāng)其值為TRUE時,其父進(jìn)程結(jié)束,該進(jìn)程也直接終止運(yùn)行(即使還沒運(yùn)行完)。
所以給上面的程序加上p.deamon = true,看看效果。
# -*- coding:utf-8 -*-from multiprocessing import Process, Poolimport osimport timedef run_proc(wTime): n = 0 while n < 3: print "subProcess %s run," % os.getpid(), "{0}".format(time.ctime()) time.sleep(wTime) n += 1if __name__ == "__main__": p = Process(target=run_proc, args=(2,)) p.daemon = True #加入daemon p.start() print "Parent process run. subProcess is ", p.pid print "Parent process end,{0}".format(time.ctime())執(zhí)行結(jié)果:
新聞熱點(diǎn)
疑難解答
圖片精選