本章節介紹了python建立進程的經常使用方式 運行程序時,單線程或單進程每每是比較慢的,下面咱們來看看吧!python
但凡是硬件,都須要有操做系統去管理,只要有操做系統,就有進程的概念,就須要有建立進程的方式,一些操做系統只爲一個應用程序設計,好比掃地機器人,一旦啓動,全部的進程都已經存在。linux
而對於通用系統(跑不少應用程序),須要有系統運行過程當中建立或撤銷進程的能力,主要分爲4中形式建立新的進程:nginx
1. 系統初始化(查看進程linux中用ps命令,windows中用任務管理器,前臺進程負責與用戶交互,後臺運行的進程與用戶無關,運行在後臺而且只在須要時才喚醒的進程,稱爲守護進程,如電子郵件、web頁面、新聞、打印)web
2. 一個進程在運行過程當中開啓了子進程(如nginx開啓多進程,os.fork,subprocess.Popen等)windows
3. 用戶的交互式請求,而建立一個新進程(如用戶用鼠標雙擊任意一款軟件圖片:qq,微信,暴風影音等)微信
4. 一個批處理做業的初始化(只在大型機的批處理系統中應用)併發
不管哪種,新進程的建立都是由一個已經存在的進程執行了一個用於建立進程的系統調用而建立的。dom
python程序中的進程操做ide
以前咱們已經瞭解了不少進程相關的理論知識,瞭解進程是什麼應該再也不困難了,剛剛咱們已經瞭解了,運行中的程序就是一個進程。全部的進程都是經過它的父進程來建立的。所以,運行起來的python程序也是一個進程,那麼咱們也能夠在程序中再建立進程。多個進程能夠實現併發效果,也就是說,當咱們的程序中存在多個進程的時候,在某些時候,就會讓程序的執行速度變快。以咱們以前所學的知識,並不能實現建立進程這個功能,因此咱們就須要藉助python中強大的模塊。函數
multiprocess模塊
仔細說來,multiprocess不是一個模塊而是python中一個操做、管理進程的包。 之因此叫multi是取自multiple的多功能的意思,在這個包中幾乎包含了和進程有關的全部子模塊。因爲提供的子模塊很是多,爲了方便你們歸類記憶,我將這部分大體分爲四個部分:建立進程部分,進程同步部分,進程池部分,進程之間數據共享。
Process類介紹
用法說明
Process(group , target , name , args , kwargs),由該類實例化獲得的對象,表示一個子進程中的任務(還沒有啓動)
強調:1. 須要使用關鍵字的方式來指定參數2. args指定的爲傳給target函數的位置參數,是一個元組形式,必須有逗號
參數介紹:1 group參數未使用,值始終爲None2 target表示調用對象,即子進程要執行的任務3 args表示調用對象的位置參數元組,args=(1,2,'kkk',)4 kwargs表示調用對象的字典,kwargs={'name':'kkk','age':18}5 name爲子進程的名稱
Process類建立進程的兩種方式
#開進程的方法一:import timeimport randomfrom multiprocessing import Processdefpiao(name): print('%s piaoing' %name)
time.sleep(random.randrange(1,5)) print('%s piao end' %name)if __name__ == '__main__':
p1=Process(target=piao,args=('kkk',)) #必須加,號 p2=Process(target=piao,args=('ttt',))
p3=Process(target=piao,args=('aaa',))
p4=Process(target=piao,args=('bbb',))
p1.start()
p2.start()
p3.start()
p4.start()
print('主線程')#開進程的方法二:import timeimport randomfrom multiprocessing import ProcessclassPiao(Process): definit(self,name): super().init()
self.name=name defrun(self): print('%s piaoing' %self.name) time.sleep(random.randrange(1,5)) print('%s piao end' %self.name)if __name__ == '__main__':
p1=Piao('ttt')
p2=Piao('aaa')
p3=Piao('bbb')
p4=Piao('ccc')
p1.start() #start會自動調用run p2.start()
p3.start()
p4.start()
print('主線程')
強調:在Windows操做系統中因爲沒有fork(linux操做系統中建立進程的機制),在建立子進程的時候會自動 import 啓動它的這個文件,而在 import 的時候又執行了整個文件。所以若是將process()直接寫在文件中就會無限遞歸建立子進程報錯。因此必須把建立子進程的部分使用if name ==‘main’ 判斷保護起來,import 的時候 ,就不會遞歸運行了。