日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

2 并发编程--开启进程的两种方式

發布時間:2023/11/27 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 并发编程--开启进程的两种方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。