摘要:可以使用標(biāo)準(zhǔn)的索引切片迭代操作訪問它,其中每項(xiàng)操作均鎖進(jìn)程同步,對于字節(jié)字符串,還具有屬性,可以把整個(gè)數(shù)組當(dāng)做一個(gè)字符串進(jìn)行訪問。當(dāng)所編寫的程序必須一次性操作大量的數(shù)組項(xiàng)時(shí),如果同時(shí)使用這種數(shù)據(jù)類型和用于同步的多帶帶大的鎖,性能將極大提升。
上一篇文章:Python進(jìn)程專題5:進(jìn)程間通信
下一篇文章:Python進(jìn)程專題7:托管對象
我們現(xiàn)在知道,進(jìn)程之間彼此是孤立的,唯一通信的方式是隊(duì)列或管道,但要讓這兩種方式完成進(jìn)程間通信,底層離不開共享內(nèi)容,這就是今天的主角:共享內(nèi)存。創(chuàng)建共享值得方法
v=Value(typecode,arg1,...,argN,lock): typecode:要么是包含array模塊使用的相同類型代碼(如"i"、"d"等)的字符串,要么是來自ctypes模塊的類型對象 (例如:ctypes.c_int,ctypes.c_double等)。 arg1,...,argN:傳遞給構(gòu)造函數(shù)的參數(shù)。 lock:只能使用關(guān)鍵字傳入的參數(shù),默認(rèn)為True:將創(chuàng)建一個(gè)新鎖來保護(hù)對值的訪問。如果傳入一個(gè)現(xiàn)有鎖,該鎖將用于進(jìn)行同步。 訪問底層的值:v.value
r=RawValue(typecode,arg1,...,argN):同Value對象,唯一區(qū)別是不存在lock
a=Array(typecode,initializer,lock):在共享內(nèi)存中創(chuàng)建ctypes數(shù)組。 initializer:要么是設(shè)置數(shù)組初始大小的整數(shù),要么是項(xiàng)序列,其值和大小用于初始化數(shù)組。 可以使用標(biāo)準(zhǔn)的Python索引、切片、迭代操作訪問它,其中每項(xiàng)操作均→鎖進(jìn)程同步, 對于字節(jié)字符串,a還具有a.value屬性,可以把整個(gè)數(shù)組當(dāng)做一個(gè)字符串進(jìn)行訪問。
r=RawArray(typcode,initlizer):同Array,單不存在鎖。當(dāng)所編寫的程序必須一次性操作大量的數(shù)組項(xiàng)時(shí), 如果同時(shí)使用這種數(shù)據(jù)類型和用于同步的多帶帶大的鎖,性能將極大提升。
原語 | 描述 |
---|---|
Lock | 互斥鎖 |
RLock | 可重入的互斥鎖(同一個(gè)進(jìn)程可以多吃獲得它,同時(shí)不會(huì)造成阻塞) |
Semaphore | 信號(hào)量 |
BoundedSemaphore | 有邊界的信號(hào)量 |
Event | 事件 |
Condition | 條件變量 |
代碼:
#使用共享數(shù)組代替管道,將一個(gè)由浮點(diǎn)數(shù)組成的Python列表發(fā)送給另外一個(gè)進(jìn)程 import multiprocessing class FloatChannel(object): def __init__(self,maxsize): #在共享內(nèi)存中創(chuàng)建一個(gè)試數(shù)組 self.buffer=multiprocessing.RawArray("d",maxsize) #在共享內(nèi)存中創(chuàng)建ctypes對象 self.buffer_len=multiprocessing.Value("i") #定義一個(gè)信號(hào)量1代表:empty self.empty=multiprocessing.Semaphore(1) #定義一個(gè)信號(hào)量0代表:full self.full=multiprocessing.Semaphore(0) def send(self,values): #只在緩存為null時(shí)繼續(xù) #acquire()會(huì)阻塞線程,直到release被調(diào)用 self.empty.acquire() nitems=len(values) print("保存內(nèi)容的長度",nitems) #設(shè)置緩沖區(qū)大小 self.buffer_len.value=nitems #將值復(fù)制到緩沖區(qū)中 self.buffer[:nitems]=values print(self.buffer[:nitems]) #發(fā)信號(hào)通知緩沖區(qū)已滿 self.full.release() def recv(self): #只在緩沖區(qū)已滿時(shí)繼續(xù) self.full.acquire() #復(fù)制值 values=self.buffer[:self.buffer_len.value] #發(fā)送信號(hào),通知緩沖區(qū)為空 self.empty.release() return values #性能測試,接受多條消息 def consume_test(count,ch): #for i in range(count): values=ch.recv() print("接收到的值:",values) #性能測試,發(fā)送多條消息 def produce_test(count,values,ch): #for i in range(count): print("發(fā)送:",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()
結(jié)果:
發(fā)送: [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0] 保存內(nèi)容的長度 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]
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/42355.html
摘要:連接帶遠(yuǎn)程管理器對象,該對象的地址在構(gòu)造函數(shù)中支出。在當(dāng)前進(jìn)程中運(yùn)行管理器服務(wù)器。啟動(dòng)一個(gè)單的子進(jìn)程,并在該子進(jìn)程中啟動(dòng)管理器服務(wù)器。如果無法序列號(hào)對象將引發(fā)異常。 上一篇文章:Python進(jìn)程專題6:共享數(shù)據(jù)與同步下一篇文章:Python進(jìn)程專題8:分布集群的消息傳遞 進(jìn)程不支持共享對象,上面描述的創(chuàng)建共享值和數(shù)組,但都是指定的特殊類型,對高級的Python對象(如:字典、列表、用...
摘要:一個(gè)進(jìn)程,通常是從上往下逐條語句執(zhí)行,這對正常人來說都比較好理解,但是當(dāng)遇到多進(jìn)程時(shí),雖然在每個(gè)進(jìn)程內(nèi)還是逐句執(zhí)行,但是這個(gè)應(yīng)用程序,體現(xiàn)出出來的就不是逐句執(zhí)行了,這也是多進(jìn)程多線程難以理解的原因。 上一篇文章:Python垃圾回收詳解下一篇文章:Python進(jìn)程專題1:fork():創(chuàng)建子進(jìn)程、getpid()、getppid() 多進(jìn)程就是同時(shí)進(jìn)行多項(xiàng)任務(wù),一個(gè)程序就可以看成是一...
摘要:上一篇文章進(jìn)程專題進(jìn)程池下一篇文章進(jìn)程專題共享數(shù)據(jù)與同步模塊支持的進(jìn)程間通信主要有兩種管道和隊(duì)列。隊(duì)列底層使用管道和鎖,同時(shí)運(yùn)行支持線程講隊(duì)列中的數(shù)據(jù)傳輸?shù)降讓庸艿乐?,來?shí)習(xí)進(jìn)程間通信。 上一篇文章:Python進(jìn)程專題4:進(jìn)程池Pool下一篇文章:Python進(jìn)程專題6:共享數(shù)據(jù)與同步 multiprocessing模塊支持的進(jìn)程間通信主要有兩種:管道和隊(duì)列。一般來說,發(fā)送較少的大...
摘要:上一篇文章進(jìn)程專題完結(jié)篇多進(jìn)程處理的一般建議下一篇文章線程專題多線程使用的必要性進(jìn)程線程進(jìn)程能夠完成多任務(wù),比如在一個(gè)電腦上可以運(yùn)行多個(gè)軟件。由于占用資源少,也使得多線程程序并發(fā)比較高。 上一篇文章:Python進(jìn)程專題完結(jié)篇:多進(jìn)程處理的一般建議下一篇文章:Python線程專題1:多線程使用的必要性 進(jìn)程VS線程 進(jìn)程:能夠完成多任務(wù),比如在一個(gè)電腦上可以運(yùn)行多個(gè)軟件。線程:也能夠...
摘要:上一篇文章線程專題多線程使用的必要性下一篇文章線程專題對象在一個(gè)進(jìn)程內(nèi)的所有線程共享全局變量。但多線程對全局變量的更改會(huì)導(dǎo)致變量值得混亂。 上一篇文章: Python線程專題1:多線程使用的必要性下一篇文章:Python線程專題3:thread對象 在一個(gè)進(jìn)程內(nèi)的所有線程共享全局變量。但多線程對全局變量的更改會(huì)導(dǎo)致變量值得混亂。 實(shí)例:驗(yàn)證同一個(gè)進(jìn)程內(nèi)所有線程共享全局變量 代碼: #...
閱讀 1610·2023-04-25 17:18
閱讀 1949·2021-10-27 14:18
閱讀 2195·2021-09-09 09:33
閱讀 1891·2019-08-30 15:55
閱讀 2086·2019-08-30 15:53
閱讀 3497·2019-08-29 16:17
閱讀 3488·2019-08-26 13:57
閱讀 1792·2019-08-26 13:46