您好,我是碼農飛哥,感謝您閱讀本文,歡迎一鍵三連哦,
本篇重點介紹Python多行程的使用,讀者朋友們可以將多行程和多執行緒兩者做一個對比學習,
干貨滿滿,建議收藏,需要用到時常看看, 小伙伴們如有問題及需要,歡迎踴躍留言哦~ ~ ~,
前言
前面我們介紹了多執行緒的使用,這篇文章將來學習多行程的使用,
行程的創建
Python的multiprocessing模塊提供了Process類,該類可用來在各平臺下創建新行程,其建構式是:
__init__(self, group=None, target=None, name=None, args=(), kwargs={})
其中,各個引數的含義如下:
- group: 該引數未實作,不需要傳參
- target:為新建行程指定執行任務,也就是指定一個函式
- args:以元組的方式,為target指定的方法傳遞引數,如果傳入的是元組中有多個引數的話則傳入方式是
(arg1,arg2,....argn,) - kwargs:以字典的方法,為target指定的方法傳遞引數,
- name: 為新建行程設定名稱
一些常用方法介紹
- start() 方法用于啟動行程
- run() 方法用于運行所要執行的任務
- is_alive() 方法用于判斷當前行程是否還活著
- getPid() 方法用于獲取行程的ID號,
1.直接創建Process類的實體物件,由此就可以創建一個新的行程;
這個就類似于直接創建實體化執行緒Thread類
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()方法來獲取行程號,
2.通過繼承Process類的子類,創建實體物件,也可以創建新的行程,
第二種方式就是通過繼承Process類的子類,創建實體物件,也可以創建新的行程,不過這種方式需要重寫父類的run()方法,這種方法就類似于直接繼承Thread類創建執行緒,
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)
運行結果同上,
這里還是推薦使用第一種方法創建行程,因為這種方式創建行程比較簡潔
行程池的使用
由于創建行程對系統的開銷比較大,所以,所以在實際開發中一般都會使用行程池來創建行程,行程池的使用與執行緒池的使用也是有神似的地方,同樣的在multiprocessing模塊中提供了Pool函式來創建行程池,
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陳述句來創建
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知識圖譜
為了更好幫助更多的小伙伴對Python從入門到精通,我從CSDN官方那邊搞來了一套 《Python全堆疊知識圖譜》,尺寸 870mm x 560mm,展開后有一張辦公桌大小,也可以折疊成一本書的尺寸,有興趣的小伙伴可以了解一下------掃描下圖中的二維碼即可購買,

我本人也已經用上了,感覺非常好用,圖譜桌上放,知識心中留,

我是碼農飛哥,再次感謝您讀完本文,
全網同名【碼農飛哥】,不積跬步,無以至千里,享受分享的快樂
我是碼農飛哥,再次感謝您讀完本文,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/299564.html
標籤:Python
