2 并发编程--开启进程的两种方式
生活随笔
收集整理的這篇文章主要介紹了
2 并发编程--开启进程的两种方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
multiprocessing??英?/m?lt?'pr??ses??/?n. [計][通信] 多重處理
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函數的位置參數,是一個元組形式,必須有逗號
參數介紹:
group參數未使用,值始終為Nonetarget表示調用對象,即子進程要執行的任務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仍然運行,返回Truep.join([timeout]):主線程等待p終止(強調:是主線程處于等的狀態,而p是處于運行的狀態)。timeout是可選的超時時間。 屬性介紹:
p.daemon:默認值為False,如果設為True,代表p為后臺運行的守護進程,當p的父進程終止時,p也隨之終止,并且設定為True后,p不能創建自己的新進程,必須在p.start()之前設置p.name:進程的名稱p.pid:進程的pid 3、Process類的使用
注意:在windows中Process()必須放到# if __name__=='__main__':下:
創建并開啟子進程的方式一:
方式一 from multiprocessing import Process import time,random def task(name):print(f"{name} is running")time.sleep(3)print(f"{name} is done") if __name__ == '__main__':# target表示調用對象,即子進程要執行的任務# args 表示調用對象的位置參數元組,args = (1,2,)# name 位子進程的名稱 實例化對象p = Process(target=task,args=('子進程1',)) # 初始化對象p.start() # 僅僅只是給操作系統發送一個信號print('主進程') #----------------------------------------------------------- 主 子進程1 is running 子進程1 is done
創建并開啟子進程的方式二:
import time import random from multiprocessing import Process class MyProcess(Process):def __init__(self,name):self.name = namesuper().__init__()self.name = namedef run(self):print(f"{self.name} is running")time.sleep(random.randrange(1,3))print(f"{self.name} id done") if __name__ == '__main__':p = MyProcess('子進程1')p.start()print('主')
?4、練習題
4.1、思考開啟進程的方式一和方式二各開啟了幾個進程?
?一個主進程,一個子進程
4.2、進程之間的內存空間是共享的還是隔離的?下述代碼的執行結果是什么?
from multiprocessing import Processn=100 #在windows系統中應該把全局變量定義在if __name__ == '__main__'之上就可以了def work():global nn=0print('子進程內: ',n)if __name__ == '__main__':p=Process(target=work)p.start()print('主進程內: ',n)
輸出:
主進程內: 100
子進程內: 0
4.3、基于多進程實現并發的套接字通信?
客戶端:
import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(('127.0.0.1',8080)) while True:msg = input('>>>').strip()if not msg:continuephone.send(msg.encode('utf-8')) # send 發給操作系統了 data = phone.recv(1024)print(data.decode('utf-8')) phone.close()View Code
服務端:
import socket from multiprocessing import Process #由該類實例化得到的對象,可用來開啟一個子進程 def talk(conn):while True:try:data = conn.recv(10240).decode('utf-8')print(data)conn.send(data.upper().encode('utf-8'))except Exception as e:print(e)break def server(ip_port):Server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)Server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 解決端口占用情況,操作系統回收端口慢Server.bind(('127.0.0.1', 8080))Server.listen(5)while True:conn,addr = Server.accept()p = Process(target=talk, args=(conn,))p.start()Server.close() if __name__ == '__main__':ip_port = ('127.0.0.1',8080)server(ip_port)View Code
?
4.4、思考每來一個客戶端,服務器就開啟一個新的進程來服務它,這種實現方式有無問題?
?這種實現方式會造成占用過多的系統資源。
轉載于:https://www.cnblogs.com/foremostxl/p/9719284.html
總結
以上是生活随笔為你收集整理的2 并发编程--开启进程的两种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上亏下亏?必采纳
- 下一篇: mysql 电商项目(一)