網路程式設計基礎 併發程式設計 多程序

2022-09-16 21:06:25 字數 4759 閱讀 1660

python中的多執行緒無法利用多核優勢,如果想要充分地使用多核cpu的資源(os.cpu_count()檢視),在python中大部分情況需要使用多程序。

python提供了multiprocessing

multiprocessing模組用來開啟子程序,並在子程序中執行我們定製的任務(比如函式),該模組與多執行緒模組threading的程式設計介面類似。

multiprocessing模組的功能眾多:支援子程序、通訊和共享資料、執行不同形式的同步,提供了process、queue、pipe、lock等元件。

需要再次強調的一點是:與執行緒不同,程序沒有任何共享狀態,程序修改的資料,改動僅限於該程序內。

建立程序的類

process([group [, target [, name [, args [, kwargs]]]]]),由該類例項化得到的物件,表示乙個子程序中的任務(尚未啟動)

強調:1.需要使用關鍵字的方式來指定引數

2. args指定的為傳給target函式的位置引數,是乙個元組形式必須有逗號

引數介紹:

target表示呼叫物件,即子程序要執行的任務
args表示呼叫物件的位置引數元組,args=(1,2,'egon',)
name為子程序的名稱

方法介紹:

p.start():  

啟動程序,並呼叫該子程序中的p.run()

p.run():

程序啟動時執行的方法,正是它去呼叫target指定的函式,我們自定義類的類中一定要實現該方法

p.terminate():

強制終止程序p,不會進行任何清理操作,如果p建立了子程序,該子程序就成了殭屍程序,

使用該方法需要特別小心這種情況。如果p還儲存了乙個鎖那麼也將不會被釋放,進而導致死鎖

p.is_alive():

如果p仍然執行,返回true

p.join([timeout]):主線程等待p終止(強調:是主線程處於等的狀態,而p是處於執行的狀態)。

timeout是可選的超時時間,需要強調的是,p.join只能join住start開啟的程序,而不能join住run開啟的程序

屬性介紹:

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字元的字串。

這個鍵的用途是為涉及網路連線的底層程序間通訊提供安全性,這類連線只有在具有相同的身份驗證鍵時才能成功(了解即可)

注意:在windows中process()必須放到# if __name__ == '__main__':下if__name__ == "

__main__

"由於windows沒有fork,多處理模組啟動乙個新的python程序並匯入呼叫模組。

如果在匯入時呼叫process(),那麼這將啟動無限繼承的新程序(或直到機器耗盡資源)。

這是隱藏對process()內部呼叫的原,使用if

__name__ == 「__main __」,這個if語句中的語句將不會在匯入時被呼叫。

#

開程序的方法一:import

time

import

random

from multiprocessing import

process

defpiao(name):

print('

%s piaoing

' %name)

time.sleep(random.randrange(1,5))

print('

%s piao end

' %name)

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

主線程'

)#

開程序的方法二:import

time

import

random

from multiprocessing import

process

class

piao(process):

def__init__

(self,name):

super().

__init__

() self.name=name

defrun(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('

主線程'

)

from multiprocessing import process

n=100 #在windows系統中應該把全域性變數定義在if __name__ == '__main__'之上就可以了

def work():

global n

n=0print('子程序內: ',n)

if __name__ == '__main__':

p=process(target=work)

p.start()

print('主程序內: ',n)

p1.terminate()    #關閉程序,不會立即關閉,所以is_alive立刻檢視的結果可能還是存活
print(p.pid)      #檢視pid 只能檢視當前的程序pid

啟動程序與join程序可以簡寫為

p_l=[p1,p2,p3,p4]

for p in p_l:

p.start()

for p in p_l:p.join()

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

python併發程式設計 多程序

import os import time from multiprocessing import process def func args,args2 print args,args2 time.sleep 3 print 子程序 os.getpid print 子程序的父程序 os.getpp...

併發程式設計 多程序1

實現原理 統一時間,載入多個任務到記憶體中,多個程序之間記憶體區域需要相互隔離,這種隔離是物理層面的隔離,其目的是為了保證數安全 指的是,作業系統會在多個程序之間做切換執行 切換任務的兩種情況 1.當乙個程序遇到了io操作 時會自動切換 2.當乙個任務執行時間超過閾值會強制切換 注意 在切換前必須儲...

併發程式設計多程序之佇列

程序彼此之間互相隔離,要實現程序間通訊 ipc multiprocessing模組支援兩種形式 佇列和管道,這兩種方式都是使用訊息傳遞的。建立佇列的類 底層就是以管道和鎖定的方式實現 queue maxsize 建立共享的程序佇列。queue是多程序安全的佇列,可以使用queue實現多程序之間的資料...