之前我們已經了解了很多進程相關的理論知識,了解進程是什么應該不再困難了,剛剛我們已經了解了,運行中的程序就是一個進程。所有的進程都是通過它的父進程來創建的。因此,運行起來的python程序也是一個進程,那么我們也可以在程序中再創建進程。多個進程可以實現並發效果,也就是說,當我們的程序中存在多個進程的時候,在某些時候,就會讓程序的執行速度變快。以我們之前所學的知識,並不能實現創建進程這個功能,所以我們就需要借助python中強大的模塊
multiprocess模塊介紹
仔細說來,multiprocess不是一個模塊而是python中一個操作、管理進程的包。 之所以叫multi是取自multiple的多功能的意思,在這個包中幾乎包含了和進程有關的所有子模塊。由於提供的子模塊非常多,為了方便大家歸類記憶,我將這部分大致分為四個部分:創建進程部分,進程同步部分,進程池部分,進程之間數據共享。
python中的多線程無法利用CPU資源,在python中大部分情況使用多進程。python中提供了非常好的多進程包multiprocessing。
multiprocessing模塊用來開啟子進程,並在子進程中執行功能(函數),該模塊與多線程模塊threading的編程接口類似。
multiprocessing的功能眾多:支持子進程、通信和共享數據、執行不同形式的同步,提供了Process、Queue、Pipe、Lock等組件。
Process類的介紹
1.創建進程的類
Process([group [, target [, name [, args [, kwargs]]]]]),由該類實例化得到的對象,表示一個子進程中的任務(尚未啟動) 強調: 1. 需要使用關鍵字的方式來指定參數 2. args指定的為傳給target函數的位置參數,是一個元組形式,必須有逗號
2.參數介紹
1 group參數未使用,值始終為None 2 3 target表示調用對象,即子進程要執行的任務 4 5 args表示調用對象的位置參數元組,args=(1,2,'egon',) 6 7 kwargs表示調用對象的字典,kwargs={'name':'egon','age':18} 8 9 name為子進程的名稱
3.方法介紹
1 p.start():啟動進程,並調用該子進程中的p.run() 2 p.run():進程啟動時運行的方法,正是它去調用target指定的函數,我們自定義類的類中一定要實現該方法 3 4 p.terminate():強制終止進程p,不會進行任何清理操作,如果p創建了子進程,該子進程就成了僵屍進程,使用該方法需要特別小心這種情況。
如果p還保存了一個鎖那么也將不會被釋放,進而導致死鎖 5 p.is_alive():如果p仍然運行,返回True 6 7 p.join([timeout]):主線程等待p終止(強調:是主線程處於等的狀態,而p是處於運行的狀態)。timeout是可選的超時時間,
需要強調的是,p.join只能join住start開啟的進程,而不能join住run開啟的進程
4.屬性介紹
p.daemon:默認值為False,如果設為True,代表p為后台運行的守護進程,當p的父進程終止時,p也隨之終止,並且設定為True后,p不能創建自己的新進程,必須在p.start()之前設置 p.name:進程的名稱 p.pid:進程的pid p.exitcode:進程在運行時為None、如果為–N,表示被信號N結束(了解即可) p.authkey:進程的身份驗證鍵,默認是由os.urandom()隨機生成的32字符的字符串。這個鍵的用途是為涉及網絡連接的底層進程間通信提供安全性,這類連接只有在具有相同的身份驗證鍵時才能成功(了解即可)
Process類的使用
一定要把開進程的代碼寫在if __name__=='__main__':下面
開一個進程和主進程是並發的關系,我start一下就是先告訴操作系統我要開一個進程
,然而它不會等待,他會去執行下面的代碼,完了他吧進程開始后,就開始執行了
strat():方法的功能
1.開啟進程
2.執行功能
開啟進程的兩種方式

1 from multiprocessing import Process 2 import time 3 import random 4 def piao(name): 5 print('%s is piaoing'%name) 6 time.sleep(random.randint(1,3)) 7 print('%s is piao end'%name) 8 if __name__ =='__main__': 9 p1 = Process(target=piao,kwargs={'name':'alex'}) 10 p2 = Process(target=piao,kwargs={'name':'alex'}) 11 p3 = Process(target=piao,kwargs={'name':'alex'}) 12 p1.start() 13 p2.start() 14 p3.start() 15 print('主進程')

1 from multiprocessing import Process 2 import time 3 import random 4 import os 5 class Piao(Process): 6 def __init__(self,name): 7 super().__init__() #必須繼承父類的一些屬性 8 self.name = name 9 def run(self): #必須得實現一個run方法 10 print(os.getppid(),os.getpid()) 11 print('%s is piaoing'%self.name) 12 time.sleep(random.randint(1,3)) 13 print('%s is piao end'%self.name) 14 if __name__ =='__main__': 15 p1 = Piao('alex') 16 p2 = Piao('wupeiqi') 17 p3 = Piao('yuanhao') 18 p1.start() 19 p2.start() 20 p3.start() 21 print('主進程',os.getpid())
getppid()父進程id
getpid() #當前進程id
多進程實現套接字並發

1 from socket import * 2 from multiprocessing import Process 3 s = socket(AF_INET,SOCK_STREAM) 4 s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) 5 s.bind(('127.0.0.1',8081)) 6 s.listen(5) 7 print('start running...') 8 def talk(coon,addr): 9 while True: 10 try: 11 data = coon.recv(1024) 12 if not data: break 13 coon.send(data.upper()) 14 except Exception: 15 break 16 coon.close() 17 18 if __name__ == '__main__': 19 while True: 20 coon,addr = s.accept() 21 print(coon,addr) 22 p =Process(target=talk,args=(coon,addr)) 23 p.start() 24 s.close()

1 from socket import * 2 c = socket(AF_INET,SOCK_STREAM) 3 c.connect(('127.0.0.1',8081)) 4 while True: 5 cmd = input('>>:').strip() 6 if not cmd:continue 7 c.send(cmd.encode('utf-8')) 8 data = c.recv(1024) 9 print(data.decode('utf-8')) 10 c.close()