1. 程式人生 > >Python之路-進程

Python之路-進程

進程間通信 網絡 自定義 windows 等待時間 名稱 read 參數 元素

進程

進程的定義:進行中的過程,是對正在運行程序的一個抽象。

1.multiprocessing模塊介紹

python中的多線程無法利用多核優勢,如果想要充分地使用多核CPU的資源(os.cpu_count()查看),在python中大部分情況需要使用多進程。Python提供了multiprocessing。
multiprocessing模塊用來開啟子進程,並在子進程中執行我們定制的任務(比如函數),該模塊與多線程模塊threading的編程接口類似。

  multiprocessing模塊的功能眾多:支持子進程、通信和共享數據、執行不同形式的同步,提供了Process、Queue、Pipe、Lock等組件。

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

2.process類

創建進程的類

Process([group [, target [, name [, args [, kwargs]]]]]),由該類實例化得到的對象,表示一個子進程中的任務(尚未啟動)

強調:
1. 需要使用關鍵字的方式來指定參數
2. args指定的為傳給target函數的位置參數,是一個元組形式,必須有逗號

參數介紹:

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

  方法介紹:

 1 p.start():啟動進程,並調用該子進程中的p.run() 
 2 p.run():進程啟動時運行的方法,正是它去調用target指定的函數,我們自定義類的類中一定要實現該方法   
 3 p.terminate():強制終止進程p,不會進行任何清理操作,如果p創建了子進程,該子進程就成了僵屍進程,使用該方法需要特別小心這種情況。如果p還保存了一個鎖那麽也將不會被釋放,進而導致死鎖
 4 p.is_alive():如果p仍然運行,返回True 
 5 p.join([timeout]):主線程等待p終止(強調:是主線程處於等的狀態,而p是處於運行的狀態)。timeout是可選的超時時間,需要強調的是,p.join只能join住start開啟的進程,而不能join住run開啟的進程  

屬性介紹:

1 p.daemon:默認值為False,如果設為True,代表p為後臺運行的守護進程,當p的父進程終止時,p也隨之終止,並且設定為True後,p不能創建自己的新進程,必須在p.start()之前設置 
2 p.name:進程的名稱
3 p.pid:進程的pid
4 p.exitcode:進程在運行時為None、如果為–N,表示被信號N結束(了解即可)
5 p.authkey:進程的身份驗證鍵,默認是由os.urandom()隨機生成的32字符的字符串。這個鍵的用途是為涉及網絡連接的底層進程間通信提供安全性,這類連接只有在具有相同的身份驗證鍵時才能成功(了解即可)

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)

p1=Process(target=piao,args=(‘user1‘,)) #必須加,號 p2=Process(target=piao,args=(‘user2‘,)) p3=Process(target=piao,args=(‘user3‘,)) p4=Process(target=piao,args=(‘user4‘,)) p1.start() p2.start() p3.start() p4.start() print(‘主線程‘)
#開進程的方法二 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)

  p1=Piao(‘egon‘)
  p2=Piao(‘alex‘)
  p3=Piao(‘wupeiqi‘)
  p4=Piao(‘yuanhao‘)

  p1.start() #start會自動調用run
  p2.start()
  p3.start()
  p4.start()
  print(‘主線程‘)

4.守護進程

主進程創建守護進程

   其一:守護進程會在主進程代碼執行結束後就終止

   其二:守護進程內無法再開啟子進程,否則拋出異常:AssertionError: daemonic processes are not allowed to have children

註意:進程之間是互相獨立的,主進程代碼運行結束,守護進程隨即終止

示例:

from multiprocessing import Process

  import time
  import random

  class Piao(Process):
      def __init__(self,name):
          self.name=name
          super().__init__()
      def run(self):
          print(‘%s is piaoing‘ %self.name)
          time.sleep(random.randrange(1,3))
          print(‘%s is piao end‘ %self.name)


  p=Piao(‘egon‘)
  p.daemon=True #一定要在p.start()前設置,設置p為守護進程,禁止p創建子進程,並且父進程代碼執行結束,p即終止運行
  p.start()
  print(‘主‘)

5.隊列

進程彼此之間互相隔離,要實現進程間通信(IPC),multiprocessing模塊支持兩種形式:隊列和管道,這兩種方式都是使用消息傳遞的

  創建隊列的類(底層就是以管道和鎖定的方式實現):

 1 Queue([maxsize]):創建共享的進程隊列,Queue是多進程安全的隊列,可以使用Queue實現多進程之間的數據傳遞。 

參數介紹:

 1 maxsize是隊列中允許最大項數,省略則無大小限制。    

  方法介紹:

主要方法:
1 q.put方法用以插入數據到隊列中,put方法還有兩個可選參數:blocked和timeout。如果blocked為True(默認值),並且timeout為正值,該方法會阻塞timeout指定的時間,直到該隊列有剩余的空間。如果超時,會拋出Queue.Full異常。如果blocked為False,但該Queue已滿,會立即拋出Queue.Full異常。
2 q.get方法可以從隊列讀取並且刪除一個元素。同樣,get方法有兩個可選參數:blocked和timeout。如果blocked為True(默認值),並且timeout為正值,那麽在等待時間內沒有取到任何元素,會拋出Queue.Empty異常。如果blocked為False,有兩種情況存在,如果Queue有一個值可用,則立即返回該值,否則,如果隊列為空,則立即拋出Queue.Empty異常.
3  
4 q.get_nowait():同q.get(False)
5 q.put_nowait():同q.put(False)
6 
7 q.empty():調用此方法時q為空則返回True,該結果不可靠,比如在返回True的過程中,如果隊列中又加入了項目。
8 q.full():調用此方法時q已滿則返回True,該結果不可靠,比如在返回True的過程中,如果隊列中的項目被取走。
9 q.qsize():返回隊列中目前項目的正確數量,結果也不可靠,理由同q.empty()和q.full()一樣

Python之路-進程