1. 程式人生 > >(python)子程序(Process類的使用)

(python)子程序(Process類的使用)

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))

執行結果: