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 ...