想要充分利用多核CPU資源,Python中大部分情況下都需要使用多進程,Python中提供了multiprocessing這個包實現多進程。multiprocessing支持子進程、進程間的同步與通信,提供了Process、Queue、Pipe、Lock等組件。
開辟子進程
multiprocessing中提供了Process類來生成進程實例
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()) #獲取當前進程號和正在運行是的時間 time.sleep(wTime) #等待(休眠) n += 1if __name__ == "__main__": p = Process(target=run_proc, args=(2,)) #申請子進程 p.start() #運行進程 print "Parent process run. subProcess is ", p.pid print "Parent process end,{0}".format(time.ctime())
運行結果:
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
根據運行結果可知,父進程運行結束后子進程仍然還在運行,這可能造成僵尸( zombie)進程。
通常情況下,當子進程終結時,它會通知父進程,清空自己所占據的內存,并在內核里留下自己的退出信息。父進程在得知子進程終結時,會從內核中取出子進程的退出信息。但是,如果父進程早于子進程終結,這可能造成子進程的退出信息滯留在內核中,子進程成為僵尸(zombie)進程。當大量僵尸進程積累時,內存空間會被擠占。
有什么辦法可以避免僵尸進程呢?
這里介紹進程的一個屬性 deamon,當其值為TRUE時,其父進程結束,該進程也直接終止運行(即使還沒運行完)。
所以給上面的程序加上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())
執行結果:
新聞熱點
疑難解答