1. 程式人生 > >Python的併發處理:(一)並行執行多個互不相干的子程序

Python的併發處理:(一)並行執行多個互不相干的子程序

這是併發處理中最簡單的一種情況。應用場景當然也很簡單。一般會是這樣:通過傳遞不同的引數,讓同一個函式在同一時間內執行幾種不同的任務,達到多工並行的效果,提升吞吐量。
我們有這樣一個要求:分別往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是完全等價的。