Python程序專題6 共享資料與同步

2021-09-13 09:46:31 字數 2934 閱讀 9384

python程序專題5:程序間通訊

python程序專題7:託管物件

我們現在知道,程序之間彼此是孤立的,唯一通訊的方式是佇列或管道,但要讓這兩種方式完成程序間通訊,底層離不開共享內容,這就是今天的主角:共享記憶體。
v=value(typecode,arg1,...,argn,lock):

typecode:要麼是包含array模組使用的相同型別**(如'i'、'd'等)的字串,要麼是來自ctypes模組的型別物件

(例如:ctypes.c_int,ctypes.c_double等)。

arg1,...,argn:傳遞給建構函式的引數。

lock:只能使用關鍵字傳入的引數,預設為true:將建立乙個新鎖來保護對值的訪問。如果傳入乙個現有鎖,該鎖將用於進行同步。

訪問底層的值:v.value

r=rawvalue(typecode,arg1,...,argn):同value物件,唯一區別是不存在lock
a=array(typecode,initializer,lock):在共享記憶體中建立ctypes陣列。

initializer:要麼是設定陣列初始大小的整數,要麼是項序列,其值和大小用於初始化陣列。

可以使用標準的python索引、切片、迭代操作訪問它,其中每項操作均→鎖程序同步,

對於位元組字串,a還具有a.value屬性,可以把整個陣列當做乙個字串進行訪問。

r=rawarray(typcode,initlizer):同array,單不存在鎖。當所編寫的程式必須一次性操作大量的陣列項時,

如果同時使用這種資料型別和用於同步的單獨大的鎖,效能將極大提公升。

除了使用上面方法建立共享值,multiprocess模組還提供了一下同步原語的共享版本。

原語描述

lock

互斥鎖rlock

可重入的互斥鎖(同乙個程序可以多吃獲得它,同時不會造成阻塞)

semaphore

訊號量boundedsemaphore

有邊界的訊號量

event

事件condition

條件變數

**:

#使用共享陣列代替管道,將乙個由浮點數組成的python列表傳送給另外乙個程序

import multiprocessing

class floatchannel(object):

def __init__(self,maxsize):

#在共享記憶體中建立乙個試陣列

self.buffer=multiprocessing.rawarray('d',maxsize)

#在共享記憶體中建立ctypes物件

self.buffer_len=multiprocessing.value('i')

#定義乙個訊號量1代表:empty

self.empty=multiprocessing.semaphore(1)

#定義乙個訊號量0代表:full

self.full=multiprocessing.semaphore(0)

def send(self,values):

#只在快取為null時繼續

#acquire()會阻塞執行緒,直到release被呼叫

self.empty.acquire()

nitems=len(values)

print("儲存內容的長度",nitems)

#設定緩衝區大小

self.buffer_len.value=nitems

#將值複製到緩衝區中

self.buffer[:nitems]=values

print(self.buffer[:nitems])

#發訊號通知緩衝區已滿

self.full.release()

def recv(self):

#只在緩衝區已滿時繼續

self.full.acquire()

#複製值

values=self.buffer[:self.buffer_len.value]

#傳送訊號,通知緩衝區為空

self.empty.release()

return values

#效能測試,接受多條訊息

def consume_test(count,ch):

#for i in range(count):

values=ch.recv()

print("接收到的值:",values)

#效能測試,傳送多條訊息

def produce_test(count,values,ch):

#for i in range(count):

print("傳送:",values)

ch.send(values)

if __name__=="__main__":

ch=floatchannel(10000)

p=multiprocessing.process(target=consume_test,args=(1000,ch))

p.start()

values=[float(x) for x in range(10)]

produce_test(10,values,ch)

print("done")

p.join()

結果:

傳送: [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]

儲存內容的長度 10

[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]

done

接收到的值: [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]

Python 多程序 共享資料

coding utf 8 from multiprocessing import process,manager import time import random defkkk a list,number for i in range 10 time.sleep random.randrange ...

python多程序共享資料

python的multiprocessing模組提供兩種共享記憶體,sharedctypes與manager,manager效率較低,但支援遠端共享記憶體。sharedctypes效率較高,快manager兩個數量級,在多程序訪問時與普通記憶體訪問相當 共享方式 支援的型別 shared memor...

python中Manager程序資料共享

from multiprocessing import process,manager 從多程序匯入過程中,管理者 import os def f d,l,e d os.getpid os.getpid getpid得到各程序的id print l l print d d print e e if ...