1. 程式人生 > >python全棧開發基礎【第二十篇】利用multiprocessing模塊開進程

python全棧開發基礎【第二十篇】利用multiprocessing模塊開進程

tco true 客戶 live() style 釋放 共享數據 lock 強制

一、multiprocessing模塊介紹

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.參數介紹

group參數未使用,值始終為None

target表示調用對象,即子進程要執行的任務

args表示調用對象的位置參數元組,args=(1,2,egon,)

kwargs表示調用對象的字典,kwargs={name:egon,age:18}

name為子進程的名稱

3.方法介紹

p.start():啟動進程,並調用該子進程中的p.run() 
p.run():進程啟動時運行的方法,正是它去調用target指定的函數,我們自定義類的類中一定要實現該方法  

p.terminate():強制終止進程p,不會進行任何清理操作,如果p創建了子進程,該子進程就成了僵屍進程,使用該方法需要特別小心這種情況。
如果p還保存了一個鎖那麽也將不會被釋放,進而導致死鎖
p.is_alive():如果p仍然運行,返回True

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.執行功能

四、開啟進程的兩種方式

#第一種方式
from multiprocessing import Process
import time
import random
def piao(name):
    print(‘%s is piaoing‘%name)
    time.sleep(random.randint(1,3))
    print(‘%s is piao end‘%name)
if __name__ ==‘__main__‘:
    p1 = Process(target=piao,kwargs={‘name‘:‘alex‘})
    p2 = Process(target=piao,kwargs={‘name‘:‘alex‘})
    p3 = Process(target=piao,kwargs={‘name‘:‘alex‘})
    p1.start()
    p2.start()
    p3.start()
    print(‘主進程‘)
#第二種方式
from multiprocessing import Process
import time
import random
import os
class Piao(Process):
    def __init__(self,name):
        super().__init__() #必須繼承父類的一些屬性
        self.name = name
    def run(self):  #必須得實現一個run方法
        print(os.getppid(),os.getpid())
        print(‘%s is piaoing‘%self.name)
        time.sleep(random.randint(1,3))
        print(‘%s is piao end‘%self.name)
if __name__ ==‘__main__‘:
    p1 = Piao(‘alex‘)
    p2 = Piao(‘wupeiqi‘)
    p3 = Piao(‘yuanhao‘)
    p1.start()
    p2.start()
    p3.start()
    print(‘主進程‘,os.getpid())

getppid()父進程id
getpid() #當前進程id

五、多進程實現套接字並發

#服務端
from socket import *
from multiprocessing import Process
s = socket(AF_INET,SOCK_STREAM)
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind((‘127.0.0.1‘,8081))
s.listen(5)
print(‘start running...‘)
def talk(coon,addr):
    while True:
        try:
            data = coon.recv(1024)
            if not data: break
            coon.send(data.upper())
        except Exception:
            break
    coon.close()

if __name__ == ‘__main__‘:
    while True:
        coon,addr = s.accept()
        print(coon,addr)
        p =Process(target=talk,args=(coon,addr))
        p.start()
    s.close()
#客戶端
from socket import *
c = socket(AF_INET,SOCK_STREAM)
c.connect((‘127.0.0.1‘,8081))
while True:
    cmd = input(‘>>:‘).strip()
    if not cmd:continue
    c.send(cmd.encode(‘utf-8‘))
    data = c.recv(1024)
    print(data.decode(‘utf-8‘))
c.close()

  

python全棧開發基礎【第二十篇】利用multiprocessing模塊開進程