python支持的進程與線程

1、multiprocessing模塊介紹python

 python中的多線程沒法利用CPU資源,在python中大部分狀況使用多進程。python中提供了很是好的多進程包multiprocessing。編程

multiprocessing模塊用來開啓子進程,並在子進程中執行功能(函數),該模塊與多線程模塊threading的編程接口相似。安全

multiprocessing的功能衆多:支持子進程、通訊和共享數據、執行不一樣形式的同步,提供了Process、Queue、Pipe、Lock等組件。網絡

2、Process類的介紹多線程

1.建立進程的類併發

Process([group [, target [, name [, args [, kwargs]]]]]),由該類實例化獲得的對象,表示一個子進程中的任務(還沒有啓動)

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

2.參數介紹dom

複製代碼
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.方法介紹socket

複製代碼
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字符的字符串。這個鍵的用途是爲涉及網絡鏈接的底層進程間通訊提供安全性,這類鏈接只有在具備相同的身份驗證鍵時才能成功(瞭解便可)
複製代碼

3、Process類的使用spa

必定要把開進程的代碼寫在if __name__=='__main__':下面

開一個進程和主進程是併發的關係,我start一下就是先告訴操做系統我要開一個進程
,然而它不會等待,他會去執行下面的代碼,完了他吧進程開始後,就開始執行了

strat():方法的功能

  1.開啓進程
  2.執行功能

4、開啓進程的兩種方式

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('主進程')

 

 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

5、多進程實現套接字併發

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()

 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()
相關文章
相關標籤/搜索