(python)子程序(Process類的使用)
阿新 • • 發佈:2019-01-10
Python提供了multiprocessing模組來開啟子程序,並在子程序中執行我們定製的任務。提一嘴(multiprocessing模組的功能眾多,支援子程序,通訊,共享資料,執行不同形式的同步。為些它提供了Process、Queue、Pipe、Lock等元件。)
建立程序的類Process:
例項化Process類可得到一個物件,來啟一個程序。
我們來看一下它的引數:
group引數未使用,值始終為None。
target表示呼叫的物件,就是子程序要執行的任務。
name可以為子程序命名。
args指定的為傳結target函式的位置引數,是一個元組形式,必須有逗號,如:args=('monicx',)
kwargs指定的為傳結target函式的關鍵字引數,是一個字典,如kwargs={'name':'monicx','age':18}
Process類的方法有:
start():啟動程序,並呼叫該子程序中的p.run()
run():程序啟動進執行的方法,就是它去呼叫target指定的函式,我們自定義類的類中一定要實現該方法。
terminate():強制終止程序。不會進行任何清理操作,如果p建立了子程序,該子程序就成了殭屍程序,使用此方法需要小心:如果此程序還儲存了一個鎖那麼也將不會釋放這個鎖,進而導致死鎖。
is_alive():判斷程序是否是“活著”的狀態。
join(timeout):讓主執行緒等待某一子程序結束,才繼續執行主程序。timeout是可選的超時時間。超過一個時間主程序就不等待了。
建立子程序的兩種方式:
方式一:
執行效果為:from multiprocessing import Process import time def test(name): print("%s is running "% name) time.sleep(2) print('%s is done'%name) if __name__ == '__main__': #在windows系統之上,開啟子程序的操作一定要放在這下面 # Process(target=test,kwargs={'name':'monicx'}) p=Process(target=test,args=('monicx',)) p.start()#向作業系統傳送一個請求,作業系統會申請記憶體空間給,然後把父程序的資料拷貝給子程序,作為子程序的初始資料。 print('=======主')
方式二:
from multiprocessing import Process
import time
class MyProcess(Process):
def __init__(self,name):
super(MyProcess,self).__init__()
self.name=name
def run(self):
print("%s is running " %self.name)
time.sleep(2)
print('%s is done'%self.name)
if __name__ == '__main__':
p=MyProcess('monicx')
p.start()#就是呼叫run()方法。
print('====主')
執行結果:
驗證,程序之間的記憶體空間是相互隔離的。
from multiprocessing import Process
import time
x=1000
def test():
global x
x=0
print('子程序結束',x)
if __name__ == '__main__':
p=Process(target=test)
p.start()
print('=======主')
time.sleep(3)
print(x)
執行結果:
父程序如何等待子程序結束——join()
from multiprocessing import Process
import time,random
def test(n):
print('%s is running'%n)
time.sleep(random.randint(1,4))
print('%s子程序結束了'%n)
if __name__ == '__main__':
start_time=time.time()
p_l=[]
for i in range(5):
p=Process(target=test,args=(i,))
p_l.append(p)
p.start()
for p in p_l:
p.join()
# p.join()#讓父程序在原地等
print('主====執行時間:%s'%(time.time()-start_time))
執行結果: