目錄
-
第十五章、python中的進(jìn)程操作-開啟多進(jìn)程
- 一、multprocess模塊
- 二、multprocess.process模塊
- 三、Process()對象方法介紹
- 四、Process()對象屬性介紹
- 五、使用process模塊創(chuàng)建進(jìn)程
- 六、進(jìn)程之間的數(shù)據(jù)隔離問題
- 七、守護(hù)進(jìn)程
- 八、terminate方法
- 九、pid和name屬性
第十五章、python中的進(jìn)程操作-開啟多進(jìn)程
一、multprocess模塊
multiprocess不是一個模塊而是python中一個操作、管理進(jìn)程的包。 在這個包中幾乎包含了和進(jìn)程有關(guān)的所有子模塊,將這部分大致分為四個部分:創(chuàng)建進(jìn)程部分,進(jìn)程同步部分,進(jìn)程池部分,進(jìn)程之間數(shù)據(jù)共享。
二、multprocess.process模塊
Process類中的參數(shù)有如下
group=None, target=None, name=None, args=(), kwargs={}
----------------------------------------------------------
eg:p = Process(target=foo)#實(shí)例化出p子進(jìn)程對象
強(qiáng)調(diào):
- 需要使用關(guān)鍵字的方式來指定參數(shù)
- args指定的為傳給target函數(shù)的位置參數(shù),是一個元組形式,必須有逗號
參數(shù)介紹:
- group參數(shù)未使用,值始終為None
- target表示調(diào)用對象,即子進(jìn)程要執(zhí)行的任務(wù)
-
args表示調(diào)用對象的位置參數(shù)元組,
args=(1,2,'egon',)
-
kwargs表示調(diào)用對象的字典,
kwargs={'name':'egon','age':18}
- name為子進(jìn)程的名稱
三、Process()對象方法介紹
-
p.start()
:啟動進(jìn)程,并調(diào)用該子進(jìn)程中的p.run() -
p.run()
:進(jìn)程啟動時運(yùn)行的方法,正是它去調(diào)用target指定的函數(shù),我們自定義類的類中一定要實(shí)現(xiàn)該方法 -
p.terminate()
:強(qiáng)制終止進(jìn)程p,不會進(jìn)行任何清理操作,如果p創(chuàng)建了子進(jìn)程,該子進(jìn)程就成了僵尸進(jìn)程,使用該方法需要特別小心這種情況。如果p還保存了一個鎖那么也將不會被釋放,進(jìn)而導(dǎo)致死鎖 -
p.is_alive()
:如果p仍然運(yùn)行,返回Truefrom multiprocessing import Process,current_process import time def foo(): print('進(jìn)程 start') time.sleep(2) print('進(jìn)程 end') if __name__ == '__main__': p = Process(target=foo) p.start() print(p.is_alive()) # True#打印與子進(jìn)程同時進(jìn)行 time.sleep(5)#在五秒內(nèi)的第三秒進(jìn)程就已經(jīng)結(jié)束了 print(p.is_alive()) # 代碼運(yùn)行完了就算死了 False print('主')
-
p.join([timeout])
:主線程等待p終止(強(qiáng)調(diào):是主線程處于等的狀態(tài),而p是處于運(yùn)行的狀態(tài))。timeout是可選的超時時間,需要強(qiáng)調(diào)的是,p.join只能join住start開啟的進(jìn)程,而不能join住run開啟的進(jìn)程from multiprocessing import Process import time def foo(): print('進(jìn)程 start ') time.sleep(2.3) print('進(jìn)程 end ') if __name__ == '__main__': p = Process(target=foo) p.start() # # 核心需求就是 # time.sleep(5) p.join() # 阻塞住主進(jìn)程再等待子進(jìn)程結(jié)束,然后再往下執(zhí)行,(了解的是:內(nèi)部會待用wait()) print('主')
四、Process()對象屬性介紹
-
p.daemon
:默認(rèn)值為False,如果設(shè)為True,代表p為后臺運(yùn)行的守護(hù)進(jìn)程,當(dāng)p的父進(jìn)程終止時,p也隨之終止,并且設(shè)定為True后,p不能創(chuàng)建自己的新進(jìn)程,必須在p.start()
之前設(shè)置 -
p.name
:進(jìn)程的名稱 -
p.pid
:進(jìn)程的pid
五、使用process模塊創(chuàng)建進(jìn)程
import time
from multiprocessing import Process
def f(name):
print('hello', name)
print('我是子進(jìn)程')
if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
time.sleep(1)
print('執(zhí)行主進(jìn)程的內(nèi)容了'
六、進(jìn)程之間的數(shù)據(jù)隔離問題
from multiprocessing import Process
import time
x = 0
def task():
global x
x = 100
print('子進(jìn)程的x修改為了{(lán)}'.format(x))
if __name__ == '__main__':
p = Process(target=task)
p.start()
time.sleep(5)
print(x)
七、守護(hù)進(jìn)程
守護(hù)進(jìn)程會隨著主進(jìn)程的結(jié)束而結(jié)束。
由主進(jìn)程創(chuàng)建守護(hù)進(jìn)程
其一:守護(hù)進(jìn)程會在主進(jìn)程代碼執(zhí)行結(jié)束后就終止
其二:守護(hù)進(jìn)程內(nèi)無法再開啟子進(jìn)程,否則拋出異常:
AssertionError: daemonic processes are not allowed to have children
from multiprocessing import Process
import time
def foo():
print('守護(hù)進(jìn)程 start')
time.sleep(5)
print('守護(hù)進(jìn)程 end')
p = Process(target=foo)#第三秒的時候主進(jìn)程結(jié)束了沒執(zhí)行到這一步,不報錯
p.start()
if __name__ == '__main__':
p = Process(target=foo)
p.daemon =True # 把這個子進(jìn)程定義為了守護(hù)進(jìn)程,
p.start()
time.sleep(2)#子進(jìn)程還沒有結(jié)束,主進(jìn)程結(jié)束了強(qiáng)制子進(jìn)程提前結(jié)束
print('主')
from multiprocessing import Process
import time
def foo():
print('守護(hù)進(jìn)程 start')
time.sleep(2)
print('守護(hù)進(jìn)程 end')
p = Process(target=foo)
p.start()
if __name__ == '__main__':
p = Process(target=foo)
p.daemon =True # 把這個子進(jìn)程定義為了守護(hù)進(jìn)程
p.start()
time.sleep(3)
print('主')
------------------------------------------------------
#報錯:AssertionError: daemonic processes are not allowed to have children
八、terminate方法
from multiprocessing import Process,current_process
import time
def foo():
print('進(jìn)程 start')
# print('--------------------- ',current_process().name)
time.sleep(50)
print('進(jìn)程 end')
if __name__ == '__main__':
p = Process(target=foo)
p.start()
time.sleep(0.45)#start比terminate慢大約0.45秒
p.terminate() # 給操作系統(tǒng)發(fā)了一個立即終止請求
print(p.is_alive()) # True
p.join()
print(p.is_alive()) # False
print('主')
-------------------------------------------------
進(jìn)程 start
True
False
主
九、pid和name屬性
class Myprocess(Process):
def __init__(self,person):
self.name=person # name屬性是Process中的屬性,標(biāo)示進(jìn)程的名字
super().__init__() # 執(zhí)行父類的初始化方法會覆蓋name屬性
# self.name = person # 在這里設(shè)置就可以修改進(jìn)程名字了
# self.person = person # 如果不想覆蓋進(jìn)程名,就修改屬性名稱就可以了
def run(self):
print('%s正在和網(wǎng)紅臉聊天' %self.name)
# print('%s正在和網(wǎng)紅臉聊天' %self.person)
time.sleep(random.randrange(1,5))
print('%s正在和網(wǎng)紅臉聊天' %self.name)
# print('%s正在和網(wǎng)紅臉聊天' %self.person)
p1=Myprocess('哪吒')
p1.start()
print(p1.pid) #可以查看子進(jìn)程的進(jìn)程id
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
