python 程序的幾種建立方式詳解
阿新 • • 發佈:2020-01-09
在新建立的子程序中,會把父程序的所有資訊複製一份,它們之間的資料互不影響。
使用os.fork()建立
該方式只能用於Unix/Linux作業系統中,在windows不能用。
import os # 注意,fork函式,只在Unix/Linux/Mac上執行,windows不可以 pid = os.fork() # 子程序永遠返回0,而父程序返回子程序的ID。 if pid == 0: print('子程序') else: print('父程序')
使用Process類類建立
multiprocessing模組提供了一個Process類來代表一個程序物件,下面的例子演示了啟動一個子程序並等待其結束:
from multiprocessing import Process import time def test(name,age): for i in range(5): print("--test--%s\t%d" % (name,age)) time.sleep(1) print("子程序結束") if __name__ == '__main__': p = Process(target=test,args=("aaa",18)) p.start() # 等待程序例項執⾏結束,或等待多少秒; p.join() # 等待的最長時間 print("主程序結束") """ 輸出結果: --test--aaa 18 --test--aaa 18 --test--aaa 18 --test--aaa 18 --test--aaa 18 子程序結束 主程序結束 """
join()方法表示主程序等待子程序執行完成後繼續往下執行,如果把join()註釋掉,則主程序開啟子程序後不停頓繼續往下執行,然後等待子程序完成程式結束。
把join()方法註釋掉的結果:
""" 輸出結果: 主程序結束 --test--aaa 18 --test--aaa 18 --test--aaa 18 --test--aaa 18 --test--aaa 18 子程序結束 """
使用Process子類建立
建立新的程序還能夠使用類的方式,可以自定義一個類,繼承Process類,每次例項化這個類的時候,就等同於例項化一個程序物件,請看下面的例項:
from multiprocessing import Process import time import os class MyProcess(Process): def __init__(self): # 如果子類要重寫__init__是必須要先呼叫父類的__init__否則會報錯 # Process.__init__(self) super(MyProcess,self).__init__() # 重寫Porcess的run()方法 def run(self): print("子程序(%s)開始執行,父程序(%s)" % (os.getpid(),os.getppid())) for i in range(5): print("--1--") time.sleep(1) if __name__ == '__main__': t_start = time.time() p = MyProcess() p.start() # p.join() print("main") for i in range(5): print("--main--") time.sleep(1)
使用程序池Pool建立
當需要建立的子程序數量不多時,可以直接利用multiprocessing中的Process動態成生多個程序,但如果是上百甚至上千個目標,手動的去建立程序的工作量巨大,此時就可以用到multiprocessing模組提供的Pool方法。
初始化Pool時,可以指定一個最大程序數,當有新的請求提交到Pool中時,如果池還沒有滿,那麼就會建立一個新的程序用來執行該請求;但如果池中的程序數已經達到指定的最大值,那麼該請求就會等待,直到池中有程序結束,才會建立新的程序來執行,請看下面的例項:
from multiprocessing import Pool import os import time def worker(num): # for i in range(3): print("----pid=%d num=%d---" % (os.getpid(),num)) time.sleep(1) if __name__ == '__main__': # 定義一個程序池,最大程序數3 pool = Pool(3) for i in range(10): print("---%d--" % i) # 使用非阻塞方式呼叫func(並行執行),一般用這個。 # apply堵塞方式必須等待上一個程序退出才能執行下一個程序,用的不多。 pool.apply_async(worker,(i,)) # 關閉程序池 pool.close() # 等待所有子程序結束,主程序一般用來等待 pool.join() # 程序池後面無操作時必須有這句
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。