進擊のpython
並發編程——開啟進程
上一節說了那么多關於進程的東西,那這一節就嘗試着自己開啟一下進程
這一節我們可以嘗試着使用multiprocessing模塊開啟進程
通過掌握multiprocessing模塊開啟進程的兩種方式
是我們在后面的學習的基礎,所以一定要好好看
multiprocessing模塊
首先,由於語言特點,python的多線程沒辦法使用多核優勢
所以說,但凡我們想要利用到多核的優勢,在python中大部分都要用到多進程
基於python的模塊多且廣的優勢,在多進程方面就有了multiprocessing這個模式進行支持
這個模塊提供的功能眾多:支持子進程等等,提供了Process,Queue,Pipe和Lock等組件
但是!這里需要強調一個問題就是:
與線程不同,進程沒有任何共享狀態,進程修改的數據,改動僅限於該進程內
Process類
class Process(object):
def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
self.name = ''
self.daemon = False
self.authkey = None
self.exitcode = None
self.ident = 0
self.pid = 0
self.sentinel = None
介紹一下參數:
group:參數未使用,值始終是None
target:表示調用對象,即子進程要執行的任務(就是塞進去一個你想執行的函數)
args:表示調用對象的位置參數元祖(就是對函數進行傳參)
kwargs:表示調用對象的字典(就是對函數進行傳參)
name:子進程的名字
介紹一下屬性:
p.daemon:默認值為False,如果設為True,代表p為后台運行的守護進程
當p的父進程終止時,p也隨之終止,並且設定為True后,p不能創建自己的新進程
必須在p.start()之前設置
p.name:進程的名稱
p.pid:進程的pid
def run(self):
pass
def start(self):
pass
def terminate(self):
pass
def join(self, timeout=None):
pass
def is_alive(self):
return False
接下來介紹一下方法:
p.start():啟動進程,並調用該子進程中的p.run()
p.run():進程啟動時運行的方法,正是它去調用target指定的函數,我們自定義類的類中一定要實現該方法
p.terminate():強制終止進程p,不會進行任何清理操作,如果p創建了子進程,該子進程就成了僵屍進程,使用該方 法需要特別小心這種情況。如果p還保存了一個鎖那么也將不會被釋放,進而導致死鎖
p.is_alive():如果p仍然運行,返回True
p.join([timeout]):主線程等待p終止(強調:是主線程處於等的狀態,而p是處於運行的狀態)
timeout是可選的超時時間
Process的使用
首先很重要的一點就是,在windows系統,進程的開啟必須放到if name == 'main':的下面
第一種方法
from multiprocessing import Process
def func(name, *args, **kwargs):
print(f'{name}執行!')
pass
if __name__ == '__main__':
p = Process(target=func, args=('子進程',))
p.start()
print('我是主進程... ...')
在主進程中創建一個子進程,用來執行函數func,並對函數進行傳參
然后利用start進行聲明子進程
第二種方法
from multiprocessing import Process
class Myprocess(Process):
"""這是Myprocess"""
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print(f'{self.name}執行!')
if __name__ == '__main__':
p = Myprocess('子進程')
p.start()
print('我是主進程... ...')
這種方法用的太少了,就看一下了解一下就行
更多的還是第一種方法的使用