摘要:可以使用標準的索引切片迭代操作訪問它,其中每項操作均鎖進程同步,對于字節字符串,還具有屬性,可以把整個數組當做一個字符串進行訪問。當所編寫的程序必須一次性操作大量的數組項時,如果同時使用這種數據類型和用于同步的多帶帶大的鎖,性能將極大提升。
上一篇文章: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,單不存在鎖。當所編寫的程序必須一次性操作大量的數組項時, 如果同時使用這種數據類型和用于同步的多帶帶大的鎖,性能將極大提升。
原語 | 描述 |
---|---|
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]
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42355.html
摘要:連接帶遠程管理器對象,該對象的地址在構造函數中支出。在當前進程中運行管理器服務器。啟動一個單的子進程,并在該子進程中啟動管理器服務器。如果無法序列號對象將引發異常。 上一篇文章:Python進程專題6:共享數據與同步下一篇文章:Python進程專題8:分布集群的消息傳遞 進程不支持共享對象,上面描述的創建共享值和數組,但都是指定的特殊類型,對高級的Python對象(如:字典、列表、用...
摘要:一個進程,通常是從上往下逐條語句執行,這對正常人來說都比較好理解,但是當遇到多進程時,雖然在每個進程內還是逐句執行,但是這個應用程序,體現出出來的就不是逐句執行了,這也是多進程多線程難以理解的原因。 上一篇文章:Python垃圾回收詳解下一篇文章:Python進程專題1:fork():創建子進程、getpid()、getppid() 多進程就是同時進行多項任務,一個程序就可以看成是一...
摘要:上一篇文章進程專題進程池下一篇文章進程專題共享數據與同步模塊支持的進程間通信主要有兩種管道和隊列。隊列底層使用管道和鎖,同時運行支持線程講隊列中的數據傳輸到底層管道中,來實習進程間通信。 上一篇文章:Python進程專題4:進程池Pool下一篇文章:Python進程專題6:共享數據與同步 multiprocessing模塊支持的進程間通信主要有兩種:管道和隊列。一般來說,發送較少的大...
摘要:上一篇文章進程專題完結篇多進程處理的一般建議下一篇文章線程專題多線程使用的必要性進程線程進程能夠完成多任務,比如在一個電腦上可以運行多個軟件。由于占用資源少,也使得多線程程序并發比較高。 上一篇文章:Python進程專題完結篇:多進程處理的一般建議下一篇文章:Python線程專題1:多線程使用的必要性 進程VS線程 進程:能夠完成多任務,比如在一個電腦上可以運行多個軟件。線程:也能夠...
摘要:上一篇文章線程專題多線程使用的必要性下一篇文章線程專題對象在一個進程內的所有線程共享全局變量。但多線程對全局變量的更改會導致變量值得混亂。 上一篇文章: Python線程專題1:多線程使用的必要性下一篇文章:Python線程專題3:thread對象 在一個進程內的所有線程共享全局變量。但多線程對全局變量的更改會導致變量值得混亂。 實例:驗證同一個進程內所有線程共享全局變量 代碼: #...
閱讀 1456·2023-04-25 17:18
閱讀 1889·2021-10-27 14:18
閱讀 2129·2021-09-09 09:33
閱讀 1844·2019-08-30 15:55
閱讀 2020·2019-08-30 15:53
閱讀 3443·2019-08-29 16:17
閱讀 3432·2019-08-26 13:57
閱讀 1734·2019-08-26 13:46