一、進程的創建
Python
的multiprocessing
模塊提供了Process
類,該類可用來在各平臺下創建新進程。其構造函數是:
1
|
__init__( self , group = None , target = None , name = None , args = (), kwargs = {}) |
其中,各個參數的含義如下:
-
group:
該參數未實現,不需要傳參 -
target
:為新建進程指定執行任務,也就是指定一個函數 -
args
:以元組的方式,為target指定的方法傳遞參數,如果傳入的是元組中有多個參數的話則傳入方式是(arg1,arg2,....argn,) -
kwargs
:以字典的方法,為target指定的方法傳遞參數。 -
name
: 為新建進程設置名稱
1、一些常用方法介紹
start()
方法用于啟動進程
run()
方法用于運行所要執行的任務
is_alive()
方法用于判斷當前進程是否還活著
getPid()
方法用于獲取進程的ID號。
直接創建Process類的實例對象,由此就可以創建一個新的進程;
這個就類似于直接創建實例化線程Thread類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
from multiprocessing import Process import os # 定義要調用的方法 def async_fun(name, add): for arc in add: print (name + str (os.getpid()) + " " + arc) if __name__ = = '__main__' : my_tuple = ( "碼農飛哥" , "今天是宅家的一天" , "30歲了還沒對象焦慮呀" ) # 創建進程 process = Process(target = async_fun, args = ( "子進程" , my_tuple)) # 啟動子進程 process.start() # 啟動主進程 async_fun( "主進程" , my_tuple) |
運行結果是:
主進程11610 碼農飛哥
主進程11610 今天是宅家的一天
主進程11610 30歲了還沒對象焦慮呀
子進程11612 碼農飛哥
子進程11612 今天是宅家的一天
子進程11612 30歲了還沒對象焦慮呀
這里需要注意的一點是,必須要將代碼放在if __name__ == '__main__':
代碼塊中。通過os.getpid()
方法來獲取進程號。
通過繼承Process類的子類,創建實例對象,也可以創建新的進程。
第二種方式就是通過繼承Process
類的子類,創建實例對象,也可以創建新的進程,不過這種方式需要重寫父類的run()方法。這種方法就類似于直接繼承Thread
類創建線程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import multiprocessing import os # 定義要調用的方法 def async_fun(name, add): for arc in add: print (name + str (os.getpid()) + " " + arc) class MyProcess(multiprocessing.Process): def __init__( self , name, add): multiprocessing.Process.__init__( self ) self .add = add self .name = name # 重寫run()方法 def run( self ): async_fun( self .name, self .add) if __name__ = = '__main__' : my_tuple = ( "碼農飛哥" , "今天是宅家的一天" , "宅家也不能虛度" ) myprocess = MyProcess( "子進程" , my_tuple) myprocess.start() # 主進程 async_fun( "主進程" , my_tuple) |
運行結果同上:
主進程11610 碼農飛哥
主進程11610 今天是宅家的一天
主進程11610 30歲了還沒對象焦慮呀
子進程11612 碼農飛哥
子進程11612 今天是宅家的一天
子進程11612 30歲了還沒對象焦慮呀
這里還是推薦使用第一種方法創建進程,因為這種方式創建進程比較簡潔
二、進程池的使用
由于創建進程對系統的開銷比較大。所以,所以在實際開發中一般都會使用進程池來創建進程。進程池的使用與線程池的使用也是有神似的地方。同樣的在multiprocessing
模塊中提供了Pool
函數來創建進程池。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import os from multiprocessing import Pool import time # 定義要調用的方法 def async_fun(add): time.sleep( 1 ) print ( "進程號:" + str (os.getpid()) + " " + add) if __name__ = = '__main__' : add = "碼農飛哥,今天是宅家的一天,30歲了還沒對象焦慮呀" # 創建包含4個進程的進程池 pool = Pool(processes = 4 ) # 提交action pool.apply_async(func = async_fun, args = (add,)) pool.apply_async(func = async_fun, args = ( "加油加油" ,)) pool.close() pool.join() |
運行結果是:
進程號:11658 碼農飛哥,今天是宅家的一天,30歲了還沒對象焦慮呀
進程號:11659 加油加油
同樣的進程池也可以通過with語句來創建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from multiprocessing import Pool import os import time def async_add( max ): time.sleep( 1 ) print ( "進程號:" + str (os.getpid()) + "最大值是" + str ( max )) if __name__ = = '__main__' : with Pool(processes = 4 ) as pool: # 使用線程池執行max計算 results = pool. map (async_add, ( 20 , 30 , 40 , 50 )) |
運行結果是:
進程號:11726最大值是20
進程號:11725最大值是30
進程號:11727最大值是40
進程號:11728最大值是50
三、多進程和多線程的優缺點對比
多進程的優點就是穩定性好,一個子進程崩潰了,不會影響主進程以及其余子進程,各個子進程各用一套獨立的內存空間。多線程的優點就是效率高,適用于批處理等功能。
多進程的缺點就是創建進程的代價非常大,因為操作系統要給每個進程分配固定的資源,并且操作系統對進程的總數會有一定的限制,若進程過多,操作系統調度都會存在問題,會造成假死狀況。
總結:
到此這篇關于Python
多進程的使用詳情的文章就介紹到這了,更多相關Python
多進程的使用,內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/u014534808/article/details/120250312