Python Process創(chuàng)建進程的2種方法詳解
前面介紹了使用 os.fork() 函數(shù)實現(xiàn)多進程編程,該方法最明顯的缺陷就是不適用于 Windows 系統(tǒng)。本節(jié)將介紹一種支持 Python 在 Windows 平臺上創(chuàng)建新進程的方法。
Python multiprocessing 模塊提供了 Process 類,該類可用來在 Windows 平臺上創(chuàng)建新進程。和使用 Thread 類創(chuàng)建多線程方法類似,使用 Process 類創(chuàng)建多進程也有以下 2 種方式:
直接創(chuàng)建 Process 類的實例對象,由此就可以創(chuàng)建一個新的進程;
通過繼承 Process 類的子類,創(chuàng)建實例對象,也可以創(chuàng)建新的進程。注意,繼承 Process 類的子類需重寫父類的 run() 方法。
不僅如此,Process 類中也提供了一些常用的屬性和方法,如表 1 所示。
屬性名或方法名 | 功能 |
---|---|
run() | 第 2 種創(chuàng)建進程的方式需要用到,繼承類中需要對方法進行重寫,該方法中包含的是新進程要執(zhí)行的代碼。 |
start() | 和啟動子線程一樣,新創(chuàng)建的進程也需要手動啟動,該方法的功能就是啟動新創(chuàng)建的線程。 |
join([timeout]) | 和 thread 類 join() 方法的用法類似,其功能是在多進程執(zhí)行過程,其他進程必須等到調(diào)用 join() 方法的進程執(zhí)行完畢(或者執(zhí)行規(guī)定的 timeout 時間)后,才能繼續(xù)執(zhí)行; |
is_alive() | 判斷當(dāng)前進程是否還活著。 |
terminate() | 中斷該進程。 |
name屬性 | 可以為該進程重命名,也可以獲得該進程的名稱。 |
daemon | 和守護線程類似,通過設(shè)置該屬性為 True,可將新建進程設(shè)置為“守護進程”。 |
pid | 返回進程的 ID 號。大多數(shù)操作系統(tǒng)都會為每個進程配備唯一的 ID 號。 |
表 1 Python Process類常用屬性和方法
接下來將一一對創(chuàng)建進程的 2 種方法做詳細的講解。
通過Process類創(chuàng)建進程
和使用 thread 類創(chuàng)建子線程的方式非常類似,使用 Process 類創(chuàng)建實例化對象,其本質(zhì)是調(diào)用該類的構(gòu)造方法創(chuàng)建新進程。Process 類的構(gòu)造方法格式如下:
def __init__(self,group=None,target=None,name=None,args=(),kwargs={})
其中,各個參數(shù)的含義為:
- group:該參數(shù)未進行實現(xiàn),不需要傳參;
- target:為新建進程指定執(zhí)行任務(wù),也就是指定一個函數(shù);
- name:為新建進程設(shè)置名稱;
- args:為 target 參數(shù)指定的參數(shù)傳遞非關(guān)鍵字參數(shù);
- kwargs:為 target 參數(shù)指定的參數(shù)傳遞關(guān)鍵字參數(shù)。
下面程序演示了如何用 Process 類創(chuàng)建新進程。
from multiprocessing import Process import os print("當(dāng)前進程ID:",os.getpid()) # 定義一個函數(shù),準備作為新進程的 target 參數(shù) def action(name,*add): print(name) for arc in add: print("%s --當(dāng)前進程%d" % (arc,os.getpid())) if __name__=='__main__': #定義為進程方法傳入的參數(shù) my_tuple = ("http://jb51.net/python/",\ "http://jb51.net/shell/",\ "http://jb51.net/java/") #創(chuàng)建子進程,執(zhí)行 action() 函數(shù) my_process = Process(target = action, args = ("my_process進程",*my_tuple)) #啟動子進程 my_process.start() #主進程執(zhí)行該函數(shù) action("主進程",*my_tuple)
程序執(zhí)行結(jié)果為:
當(dāng)前進程ID: 12980
主進程
http://jb51.net/python/ --當(dāng)前進程12980
http://jb51.net/shell/ --當(dāng)前進程12980
http://jb51.net/java/ --當(dāng)前進程12980
當(dāng)前進程ID: 12860
my_process進程
http://jb51.net/python/ --當(dāng)前進程12860
http://jb51.net/shell/ --當(dāng)前進程12860
http://jb51.net/java/ --當(dāng)前進程12860
需要說明的是,通過 multiprocessing.Process 來創(chuàng)建并啟動進程時,程序必須先判斷 if __name__=='__main__':,否則運行該程序會引發(fā)異常。
此程序中有 2 個進程,分別為主進程和我們創(chuàng)建的新進程,主進程會執(zhí)行整個程序,而子進程不會執(zhí)行 if __name__ == '__main__' 中包含的程序,而是先執(zhí)行此判斷語句之外的所有可執(zhí)行程序,然后再執(zhí)行我們分配讓它的任務(wù)(也就是通過 target 參數(shù)指定的函數(shù))。
通過Process繼承類創(chuàng)建進程
和使用 thread 子類創(chuàng)建線程的方式類似,除了直接使用 Process 類創(chuàng)建進程,還可以通過創(chuàng)建 Process 的子類來創(chuàng)建進程。
需要注意的是,在創(chuàng)建 Process 的子類時,需在子類內(nèi)容重寫 run() 方法。實際上,該方法所起到的作用,就如同第一種創(chuàng)建方式中 target 參數(shù)執(zhí)行的函數(shù)。
另外,通過 Process 子類創(chuàng)建進程,和使用 Process 類一樣,先創(chuàng)建該類的實例對象,然后調(diào)用 start() 方法啟動該進程。下面程序演示如何通過 Process 子類創(chuàng)建一個進程。
from multiprocessing import Process import os print("當(dāng)前進程ID:",os.getpid()) # 定義一個函數(shù),供主進程調(diào)用 def action(name,*add): print(name) for arc in add: print("%s --當(dāng)前進程%d" % (arc,os.getpid())) #自定義一個進程類 class My_Process(Process): def __init__(self,name,*add): super().__init__() self.name = name self.add = add def run(self): print(self.name) for arc in self.add: print("%s --當(dāng)前進程%d" % (arc,os.getpid())) if __name__=='__main__': #定義為進程方法傳入的參數(shù) my_tuple = ("http://jb51.net/python/",\ "http://jb51.net/shell/",\ "http://jb51.net/java/") my_process = My_Process("my_process進程",*my_tuple) #啟動子進程 my_process.start() #主進程執(zhí)行該函數(shù) action("主進程",*my_tuple)
程序執(zhí)行結(jié)果為:
當(dāng)前進程ID: 22240
主進程
http://jb51.net/python/ --當(dāng)前進程22240
http://jb51.net/shell/ --當(dāng)前進程22240
http://jb51.net/java/ --當(dāng)前進程22240
當(dāng)前進程ID: 18848
my_process進程
http://jb51.net/python/ --當(dāng)前進程18848
http://jb51.net/shell/ --當(dāng)前進程18848
http://jb51.net/java/ --當(dāng)前進程18848
顯然,該程序的運行結(jié)果與上一個程序的運行結(jié)果大致相同,它們只是創(chuàng)建進程的方式略有不同而已。
推薦讀者使用第一種方式來創(chuàng)建進程,因為這種方式不僅編程簡單,而且進程直接包裝 target 函數(shù),具有更清晰的邏輯結(jié)構(gòu)。
到此這篇關(guān)于Python Process創(chuàng)建進程的2種方法詳解的文章就介紹到這了,更多相關(guān)Python Process創(chuàng)建進程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3中類的繼承以及self和super的區(qū)別詳解
今天小編就為大家分享一篇python3中類的繼承以及self和super的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python實現(xiàn)Word和TXT文件格式之間的相互轉(zhuǎn)換
Word文檔(.doc或.docx)和純文本文件(.txt)是兩種常用的文件格式,本文將詳細介紹如何使用Python實現(xiàn)Word和TXT文件格式之間的相互轉(zhuǎn)換,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下2024-07-07python實現(xiàn)的一個火車票轉(zhuǎn)讓信息采集器
這篇文章主要介紹了python實現(xiàn)的一個火車票轉(zhuǎn)讓信息采集器,采集信息來源是58同程或者趕集網(wǎng),需要的朋友可以參考下2014-07-07Flask SocketIO實現(xiàn)動態(tài)繪圖的示例詳解
Flask-SocketIO 是基于 Flask 的一個擴展,用于簡化在 Flask 應(yīng)用中集成 WebSocket 功能,本文主要介紹了Flask SocketIO如何實現(xiàn)動態(tài)繪圖,需要的可以參考下2023-11-11Python爬蟲爬取微博熱搜保存為 Markdown 文件的源碼
這篇文章主要介紹了Python爬蟲爬取微博熱搜保存為 Markdown 文件,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02