成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python進程專題6:共享數(shù)據(jù)與同步

Yuanf / 2197人閱讀

摘要:可以使用標(biāo)準(zhǔn)的索引切片迭代操作訪問它,其中每項操作均鎖進程同步,對于字節(jié)字符串,還具有屬性,可以把整個數(shù)組當(dāng)做一個字符串進行訪問。當(dāng)所編寫的程序必須一次性操作大量的數(shù)組項時,如果同時使用這種數(shù)據(jù)類型和用于同步的多帶帶大的鎖,性能將極大提升。

上一篇文章:Python進程專題5:進程間通信
下一篇文章:Python進程專題7:托管對象
我們現(xiàn)在知道,進程之間彼此是孤立的,唯一通信的方式是隊列或管道,但要讓這兩種方式完成進程間通信,底層離不開共享內(nèi)容,這就是今天的主角:共享內(nèi)存。
創(chuàng)建共享值得方法

Value

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)建一個新鎖來保護對值的訪問。如果傳入一個現(xiàn)有鎖,該鎖將用于進行同步。

訪問底層的值:v.value

RawValue

r=RawValue(typecode,arg1,...,argN):同Value對象,唯一區(qū)別是不存在lock

Array

a=Array(typecode,initializer,lock):在共享內(nèi)存中創(chuàng)建ctypes數(shù)組。
initializer:要么是設(shè)置數(shù)組初始大小的整數(shù),要么是項序列,其值和大小用于初始化數(shù)組。
可以使用標(biāo)準(zhǔn)的Python索引、切片、迭代操作訪問它,其中每項操作均→鎖進程同步,
對于字節(jié)字符串,a還具有a.value屬性,可以把整個數(shù)組當(dāng)做一個字符串進行訪問。

RawArray

r=RawArray(typcode,initlizer):同Array,單不存在鎖。當(dāng)所編寫的程序必須一次性操作大量的數(shù)組項時,
如果同時使用這種數(shù)據(jù)類型和用于同步的多帶帶大的鎖,性能將極大提升。

同步原語

除了使用上面方法創(chuàng)建共享值,multiprocess模塊還提供了一下同步原語的共享版本。
原語 描述
Lock 互斥鎖
RLock 可重入的互斥鎖(同一個進程可以多吃獲得它,同時不會造成阻塞)
Semaphore 信號量
BoundedSemaphore 有邊界的信號量
Event 事件
Condition 條件變量
實例:使用共享數(shù)組代替管道,將一個由浮點數(shù)組成的Python隊列發(fā)送給另外一個進程。

代碼:

#使用共享數(shù)組代替管道,將一個由浮點數(shù)組成的Python列表發(fā)送給另外一個進程
import multiprocessing

class FloatChannel(object):
    def __init__(self,maxsize):
        #在共享內(nèi)存中創(chuàng)建一個試數(shù)組
        self.buffer=multiprocessing.RawArray("d",maxsize)
        #在共享內(nèi)存中創(chuàng)建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時繼續(xù)
        #acquire()會阻塞線程,直到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ā)信號通知緩沖區(qū)已滿
        self.full.release()

    def recv(self):
        #只在緩沖區(qū)已滿時繼續(xù)
        self.full.acquire()
        #復(fù)制值
        values=self.buffer[:self.buffer_len.value]
        #發(fā)送信號,通知緩沖區(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://systransis.cn/yun/42355.html

相關(guān)文章

  • Python進程專題7:托管對象

    摘要:連接帶遠(yuǎn)程管理器對象,該對象的地址在構(gòu)造函數(shù)中支出。在當(dāng)前進程中運行管理器服務(wù)器。啟動一個單的子進程,并在該子進程中啟動管理器服務(wù)器。如果無法序列號對象將引發(fā)異常。 上一篇文章:Python進程專題6:共享數(shù)據(jù)與同步下一篇文章:Python進程專題8:分布集群的消息傳遞 進程不支持共享對象,上面描述的創(chuàng)建共享值和數(shù)組,但都是指定的特殊類型,對高級的Python對象(如:字典、列表、用...

    DevYK 評論0 收藏0
  • Python進程專題總覽篇

    摘要:一個進程,通常是從上往下逐條語句執(zhí)行,這對正常人來說都比較好理解,但是當(dāng)遇到多進程時,雖然在每個進程內(nèi)還是逐句執(zhí)行,但是這個應(yīng)用程序,體現(xiàn)出出來的就不是逐句執(zhí)行了,這也是多進程多線程難以理解的原因。 上一篇文章:Python垃圾回收詳解下一篇文章:Python進程專題1:fork():創(chuàng)建子進程、getpid()、getppid() 多進程就是同時進行多項任務(wù),一個程序就可以看成是一...

    HtmlCssJs 評論0 收藏0
  • Python進程專題5:進程間通信

    摘要:上一篇文章進程專題進程池下一篇文章進程專題共享數(shù)據(jù)與同步模塊支持的進程間通信主要有兩種管道和隊列。隊列底層使用管道和鎖,同時運行支持線程講隊列中的數(shù)據(jù)傳輸?shù)降讓庸艿乐校瑏韺嵙?xí)進程間通信。 上一篇文章:Python進程專題4:進程池Pool下一篇文章:Python進程專題6:共享數(shù)據(jù)與同步 multiprocessing模塊支持的進程間通信主要有兩種:管道和隊列。一般來說,發(fā)送較少的大...

    eccozhou 評論0 收藏0
  • Python線程專題縱覽篇

    摘要:上一篇文章進程專題完結(jié)篇多進程處理的一般建議下一篇文章線程專題多線程使用的必要性進程線程進程能夠完成多任務(wù),比如在一個電腦上可以運行多個軟件。由于占用資源少,也使得多線程程序并發(fā)比較高。 上一篇文章:Python進程專題完結(jié)篇:多進程處理的一般建議下一篇文章:Python線程專題1:多線程使用的必要性 進程VS線程 進程:能夠完成多任務(wù),比如在一個電腦上可以運行多個軟件。線程:也能夠...

    張紅新 評論0 收藏0
  • Python線程專題2:多線程共享全局變量

    摘要:上一篇文章線程專題多線程使用的必要性下一篇文章線程專題對象在一個進程內(nèi)的所有線程共享全局變量。但多線程對全局變量的更改會導(dǎo)致變量值得混亂。 上一篇文章: Python線程專題1:多線程使用的必要性下一篇文章:Python線程專題3:thread對象 在一個進程內(nèi)的所有線程共享全局變量。但多線程對全局變量的更改會導(dǎo)致變量值得混亂。 實例:驗證同一個進程內(nèi)所有線程共享全局變量 代碼: #...

    Tangpj 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<