Python多進(jìn)程的使用詳情
一、進(jìn)程的創(chuàng)建
Python
的multiprocessing
模塊提供了Process
類,該類可用來(lái)在各平臺(tái)下創(chuàng)建新進(jìn)程。其構(gòu)造函數(shù)是:
__init__(self, group=None, target=None, name=None, args=(), kwargs={})
其中,各個(gè)參數(shù)的含義如下:
group:
該參數(shù)未實(shí)現(xiàn),不需要傳參target
:為新建進(jìn)程指定執(zhí)行任務(wù),也就是指定一個(gè)函數(shù)args
:以元組的方式,為target指定的方法傳遞參數(shù),如果傳入的是元組中有多個(gè)參數(shù)的話則傳入方式是(arg1,arg2,....argn,)kwargs
:以字典的方法,為target指定的方法傳遞參數(shù)。name
: 為新建進(jìn)程設(shè)置名稱
1、一些常用方法介紹
start()
方法用于啟動(dòng)進(jìn)程
run()
方法用于運(yùn)行所要執(zhí)行的任務(wù)
is_alive()
方法用于判斷當(dāng)前進(jìn)程是否還活著
getPid()
方法用于獲取進(jìn)程的ID號(hào)。
直接創(chuàng)建Process類的實(shí)例對(duì)象,由此就可以創(chuàng)建一個(gè)新的進(jìn)程;
這個(gè)就類似于直接創(chuàng)建實(shí)例化線程Thread類
from multiprocessing import Process import os # 定義要調(diào)用的方法 def async_fun(name, add): for arc in add: print(name + str(os.getpid()) + " " + arc) if __name__ == '__main__': my_tuple = ("碼農(nóng)飛哥", "今天是宅家的一天", "30歲了還沒(méi)對(duì)象焦慮呀") # 創(chuàng)建進(jìn)程 process = Process(target=async_fun, args=("子進(jìn)程", my_tuple)) # 啟動(dòng)子進(jìn)程 process.start() # 啟動(dòng)主進(jìn)程 async_fun("主進(jìn)程", my_tuple)
運(yùn)行結(jié)果是:
主進(jìn)程11610 碼農(nóng)飛哥
主進(jìn)程11610 今天是宅家的一天
主進(jìn)程11610 30歲了還沒(méi)對(duì)象焦慮呀
子進(jìn)程11612 碼農(nóng)飛哥
子進(jìn)程11612 今天是宅家的一天
子進(jìn)程11612 30歲了還沒(méi)對(duì)象焦慮呀
這里需要注意的一點(diǎn)是,必須要將代碼放在if __name__ == '__main__':
代碼塊中。通過(guò)os.getpid()
方法來(lái)獲取進(jìn)程號(hào)。
通過(guò)繼承Process類的子類,創(chuàng)建實(shí)例對(duì)象,也可以創(chuàng)建新的進(jìn)程。
第二種方式就是通過(guò)繼承Process
類的子類,創(chuàng)建實(shí)例對(duì)象,也可以創(chuàng)建新的進(jìn)程,不過(guò)這種方式需要重寫(xiě)父類的run()方法。這種方法就類似于直接繼承Thread
類創(chuàng)建線程。
import multiprocessing import os # 定義要調(diào)用的方法 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 # 重寫(xiě)run()方法 def run(self): async_fun(self.name, self.add) if __name__ == '__main__': my_tuple = ("碼農(nóng)飛哥", "今天是宅家的一天", "宅家也不能虛度") myprocess = MyProcess("子進(jìn)程", my_tuple) myprocess.start() # 主進(jìn)程 async_fun("主進(jìn)程", my_tuple)
運(yùn)行結(jié)果同上:
主進(jìn)程11610 碼農(nóng)飛哥
主進(jìn)程11610 今天是宅家的一天
主進(jìn)程11610 30歲了還沒(méi)對(duì)象焦慮呀
子進(jìn)程11612 碼農(nóng)飛哥
子進(jìn)程11612 今天是宅家的一天
子進(jìn)程11612 30歲了還沒(méi)對(duì)象焦慮呀
這里還是推薦使用第一種方法創(chuàng)建進(jìn)程,因?yàn)檫@種方式創(chuàng)建進(jìn)程比較簡(jiǎn)潔
二、進(jìn)程池的使用
由于創(chuàng)建進(jìn)程對(duì)系統(tǒng)的開(kāi)銷比較大。所以,所以在實(shí)際開(kāi)發(fā)中一般都會(huì)使用進(jìn)程池來(lái)創(chuàng)建進(jìn)程。進(jìn)程池的使用與線程池的使用也是有神似的地方。同樣的在multiprocessing
模塊中提供了Pool
函數(shù)來(lái)創(chuàng)建進(jìn)程池。
import os from multiprocessing import Pool import time # 定義要調(diào)用的方法 def async_fun(add): time.sleep(1) print("進(jìn)程號(hào):" + str(os.getpid()) + " " + add) if __name__ == '__main__': add = "碼農(nóng)飛哥,今天是宅家的一天,30歲了還沒(méi)對(duì)象焦慮呀" # 創(chuàng)建包含4個(gè)進(jìn)程的進(jìn)程池 pool = Pool(processes=4) # 提交action pool.apply_async(func=async_fun, args=(add,)) pool.apply_async(func=async_fun, args=("加油加油",)) pool.close() pool.join()
運(yùn)行結(jié)果是:
進(jìn)程號(hào):11658 碼農(nóng)飛哥,今天是宅家的一天,30歲了還沒(méi)對(duì)象焦慮呀
進(jìn)程號(hào):11659 加油加油
同樣的進(jìn)程池也可以通過(guò)with語(yǔ)句來(lái)創(chuàng)建
from multiprocessing import Pool import os import time def async_add(max): time.sleep(1) print("進(jìn)程號(hào):" + str(os.getpid()) + "最大值是" + str(max)) if __name__ == '__main__': with Pool(processes=4) as pool: # 使用線程池執(zhí)行max計(jì)算 results = pool.map(async_add, (20, 30, 40, 50))
運(yùn)行結(jié)果是:
進(jìn)程號(hào):11726最大值是20
進(jìn)程號(hào):11725最大值是30
進(jìn)程號(hào):11727最大值是40
進(jìn)程號(hào):11728最大值是50
三、多進(jìn)程和多線程的優(yōu)缺點(diǎn)對(duì)比
多進(jìn)程的優(yōu)點(diǎn)就是穩(wěn)定性好,一個(gè)子進(jìn)程崩潰了,不會(huì)影響主進(jìn)程以及其余子進(jìn)程,各個(gè)子進(jìn)程各用一套獨(dú)立的內(nèi)存空間。多線程的優(yōu)點(diǎn)就是效率高,適用于批處理等功能。
多進(jìn)程的缺點(diǎn)就是創(chuàng)建進(jìn)程的代價(jià)非常大,因?yàn)椴僮飨到y(tǒng)要給每個(gè)進(jìn)程分配固定的資源,并且操作系統(tǒng)對(duì)進(jìn)程的總數(shù)會(huì)有一定的限制,若進(jìn)程過(guò)多,操作系統(tǒng)調(diào)度都會(huì)存在問(wèn)題,會(huì)造成假死狀況。
總結(jié):
到此這篇關(guān)于Python
多進(jìn)程的使用詳情的文章就介紹到這了,更多相關(guān)Python
多進(jìn)程的使用,內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Django中動(dòng)態(tài)地過(guò)濾查詢集的實(shí)現(xiàn)
本文主要介紹了Django中動(dòng)態(tài)地過(guò)濾查詢集的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03pytorch標(biāo)簽轉(zhuǎn)onehot形式實(shí)例
今天小編就為大家分享一篇pytorch標(biāo)簽轉(zhuǎn)onehot形式實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01利用python實(shí)現(xiàn)在微信群刷屏的方法
今天小編就為大家分享一篇利用python實(shí)現(xiàn)在微信群刷屏的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02numpy ndarray 按條件篩選數(shù)組,關(guān)聯(lián)篩選的例子
今天小編就為大家分享一篇numpy ndarray 按條件篩選數(shù)組,關(guān)聯(lián)篩選的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11python+selenium+PhantomJS抓取網(wǎng)頁(yè)動(dòng)態(tài)加載內(nèi)容
一般我們使用python的第三方庫(kù)requests及框架scrapy來(lái)爬取網(wǎng)上的資源,但是設(shè)計(jì)javascript渲染的頁(yè)面卻不能抓取,此 時(shí),我們使用web自動(dòng)化測(cè)試化工具Selenium+無(wú)界面瀏覽器PhantomJS來(lái)抓取javascript渲染的頁(yè)面,下面實(shí)現(xiàn)一個(gè)簡(jiǎn)單的爬取2020-02-02如何利用python寫(xiě)GUI及生成.exe可執(zhí)行文件
工作中需要開(kāi)發(fā)一個(gè)小工具,簡(jiǎn)單的UI界面可以很好的提高工具的實(shí)用性,由此開(kāi)啟了我的第一次GUI開(kāi)發(fā)之旅,這篇文章主要給大家介紹了關(guān)于如何利用python寫(xiě)GUI及生成.exe可執(zhí)行文件的相關(guān)資料,需要的朋友可以參考下2021-12-12python實(shí)現(xiàn)汽車管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)汽車管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11