網絡編程之併發編程——開啓進程的兩種方式

網絡編程之併發編程——開啓進程的兩種方式

1、multiprocessing模塊介紹

python中的多線程沒法利用多核優點,若是想要充分地使用多核CPU的資源(os.cpu_cunt()查看),在python中大部分狀況須要使用多進程。python

python提供了multiprocessing。multiprocessing模塊用來開啓子進程,並在子進程中執行咱們定製的任務(好比函數),該模塊與多線程模塊threading的編程接口相似。multiprocessing模塊的功能衆多:支持子進程、通訊和共享數據、執行不一樣形式的同步,提供了Process、Queue、Pipe、Lock等組件。編程

須要再次強調的一點是:與線程不一樣,進程沒有任何共享狀態,進程修改的數據,改變僅限於進程內。windows

2、Process類的介紹

建立進程的類:網絡

Process([group [, target [, name [, args [, kwargs]]]]]),由該類實例化獲得的對象,可用來開啓一個子進程
強調:
1. 須要使用關鍵字的方式來指定參數
2. args指定的爲傳給target函數的位置參數,是一個元組形式,必須有逗號

參數介紹:多線程

group參數未使用,值始終爲None
target表示調用對象,即子進程要執行的任務
args表示調用對象的位置參數元組,args=(1,2,'egon',)
kwargs表示調用對象的字典,kwargs={'name':'egon','age':18}
name爲子進程的名稱

方法介紹:併發

p.start():啓動進程,並調用該子進程中的p.run() 
p.run():進程啓動時運行的方法,正是它去調用target指定的函數,咱們自定義類的類中必定要實現該方法  
p.terminate():強制終止進程p,不會進行任何清理操做,若是p建立了子進程,該子進程就成了殭屍進程,使用該方法須要特別當心這種狀況。若是p還保存了一個鎖那麼也將不會被釋放,進而致使死鎖
p.is_alive():若是p仍然運行,返回True
p.join([timeout]):主線程等待p終止(強調:是主線程處於等的狀態,而p是處於運行的狀態)。timeout是可選的超時時間。

屬性介紹:dom

p.daemon:默認值爲False,若是設爲True,表明p爲後臺運行的守護進程,當p的父進程終止時,p也隨之終止,而且設定爲True後,p不能建立本身的新進程,必須在p.start()以前設置
p.name:進程的名稱
p.pid:進程的pid

3、Process類的使用

注:在windows中Process()必須放到if __name__ == '__main__'下。函數

建立並開啓子進程的方式一:線程

import time
import random
from multiprocessing import Process
def piao(name):
    print('%s piaoing' %name)
    time.sleep(random.randrange(1,5))
    print('%s piao end' %name)
if __name__ == '__main__':
    #實例化獲得四個對象
    p1=Process(target=piao,args=('egon',)) #必須加,號
    p2=Process(target=piao,args=('alex',))
    p3=Process(target=piao,args=('wupeqi',))
    p4=Process(target=piao,args=('yuanhao',))
    #調用對象下的方法,開啓四個進程
    p1.start()
    p2.start()
    p3.start()
    p4.start()
    print('主')

建立並開啓子進程的方式二:code

import time
import random
from multiprocessing import Process
class Piao(Process):
    def __init__(self,name):
        super().__init__()
        self.name=name
    def run(self):
        print('%s piaoing' %self.name)
        time.sleep(random.randrange(1,5))
        print('%s piao end' %self.name)
if __name__ == '__main__':
    #實例化獲得四個對象
    p1=Piao('egon')
    p2=Piao('alex')
    p3=Piao('wupeiqi')
    p4=Piao('yuanhao')
    #調用對象下的方法,開啓四個進程
    p1.start() #start會自動調用run
    p2.start()
    p3.start()
    p4.start()
    print('主')
相關文章
相關標籤/搜索