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

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