Python的併發處理:(一)並行執行多個互不相干的子程序
阿新 • • 發佈:2019-01-02
這是併發處理中最簡單的一種情況。應用場景當然也很簡單。一般會是這樣:通過傳遞不同的引數,讓同一個函式在同一時間內執行幾種不同的任務,達到多工並行的效果,提升吞吐量。
我們有這樣一個要求:分別往2個檔案中寫入百W級資料,在序列狀態下的指令碼是這樣的:
【code-1】
import time ''' 寫檔案 ''' def write_file(filename,num): target = open(filename, 'w') for i in range(1,num+1): target.write("%d line\n" % i) if __name__ == '__main__': start = time.time() #100W write_file('1.txt', 1000000) #200W write_file('2.txt', 2000000) end = time.time() print str(round(end-start,3))+'s'
在我的機器上執行結果輸出是:
6.557s
那麼如果用多程序的方式呢:
【code-2】
import time import multiprocessing def write_file(filename,num): target = open(filename, 'w') for i in range(1,num+1): target.write("%d line\n" % i) if __name__ == '__main__': start = time.time() p1 = multiprocessing.Process(target=write_file,args=('1.txt', 1000000)) p2 = multiprocessing.Process(target=write_file,args=('2.txt', 2000000)) #啟動子程序 p1.start() p2.start() #等待fork的子程序終止再繼續往下執行,可選填一個timeout引數 p1.join() p2.join() end = time.time() print str(round(end-start,3))+'s'
輸出結果:3.418s
這個例子說明了如何以單獨程序的形式建立和啟動函式。有時候更習慣想把它定義成一個物件。像下面這樣:
【code-3】
import time import multiprocessing ''' 新的類繼承自Process類 ''' class Write_file(multiprocessing.Process): def __init__(self,filename,num): multiprocessing.Process.__init__(self) self.filename = filename self.num = num def run(self): target = open(self.filename, 'w') for i in range(1,self.num+1): target.write("%d line\n" % i) if __name__ == '__main__': start = time.time() p1 = Write_file('1.txt', 1000000) p2 = Write_file('2.txt', 1000000) p1.start() p2.start() p1.join() p2.join() end = time.time() print str(round(end-start,3))+'s'
當然,例程2和3是完全等價的。