溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python進(jìn)程間共享數(shù)據(jù)的方法

發(fā)布時(shí)間:2021-09-14 03:25:00 來源:億速云 閱讀:170 作者:chen 欄目:編程語言

這篇文章主要講解了“python進(jìn)程間共享數(shù)據(jù)的方法”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“python進(jìn)程間共享數(shù)據(jù)的方法”吧!

def worker(num, mystr, arr):
    num.value *= 2
    mystr.value = "ok"
    for i in range(len(arr)):
        arr[i] = arr[i] * (-1) + 1.5

def dump_vars(num, mystr, arr):
    print 'num: ', num.value
    print 'str: ', mystr[:]
    print 'arr: ', arr[:]

if __name__=='__main__':
    num = Value('i', 5)
    mystr = Array('c', 'just for test')
    arr = Array('d', [1.0, 1.5, -2.0])
    dir(str)
    print 'init value'
    dump_vars(num, mystr, arr)

    ps = [Process(target=worker, args=(num, mystr, arr)) for x in range(3)]
    for p in ps:
        p.start()
    for p in ps:
        p.join()

    print
    print 'after all workers finished'
    dump_vars(num, mystr, arr)

上述代碼打印結(jié)果:

python進(jìn)程間共享數(shù)據(jù)的方法

注意看紅色框住的內(nèi)容,多次測試我發(fā)現(xiàn),在共享字符串的時(shí)候,在主進(jìn)程中的初始化決定了這個(gè)字符串的長度,

創(chuàng)建后字符串的長度固定不變,相當(dāng)于把這個(gè)字符串所在的地址復(fù)制給一個(gè)指針,并且在字符串的首地址記錄了自身的長度,

在以后讀取這個(gè)值的時(shí)候就會(huì)去讀取那一段固定長度的內(nèi)容,而不管現(xiàn)在的新內(nèi)容長度是多少,舉個(gè)例子:

比如我們在主進(jìn)程初始化一段字符串  "abcde",一旦初始化,長度就固定了,現(xiàn)在長度是5,然后我們在其他進(jìn)程賦值,我們嘗試賦值為

"abcdefg",此時(shí)執(zhí)行會(huì)報(bào)錯(cuò),因?yàn)殚L度超標(biāo)了,我們在賦值為 "yes",最后輸出結(jié)果為 "yes&efg"(此處的&是代表一個(gè)不可顯示的字符,不同的環(huán)境下顯示不同,有可能顯示空格,有可能顯示null)。也就是說長短都不行,必須和初始化字符串等長。

于是得出這樣一個(gè)結(jié)論,如果你要共享一個(gè)字符串,那么在子進(jìn)程中賦值時(shí)必須賦值長度相當(dāng)?shù)淖址=ㄗh在子進(jìn)程中可以先檢查字符串長度,然后在根據(jù)需要拼接指定長度的字符串

上面的分析建立在下面的基礎(chǔ)上,請先看下面的基本用法:

多進(jìn)程間共享數(shù)據(jù),可以使用 multiprocessing.Value 和 multiprocessing.Array

Value(typecode_or_type, *args[, lock])
Value函數(shù)返回一個(gè)shared memory包裝類,其中包含一個(gè)ctypes對象
typecode_or_type typecode列表如下
------------------------------------------------------------------
Type code   C Type      Python Type
'c'     char            character
'b'         signed char         int
'B'         unsigned char       int
'u'         Py_UNICODE      Unicode character
'h'         signed short        int
'H'         unsigned short      int
'i'         signed int      int
'I'         unsigned int        long
'l'         signed long         int
'L'         unsigned long       long
'f'         float       float
'd'         double      float
---------------------------------------------------------
Array(typecode_or_type, size_or_initializer, *, lock=True)
lock 默認(rèn)值是True:創(chuàng)建一個(gè)新的lock來控制對value的訪問。該參數(shù)也可以是 multiprocessing.Lock 或 multiprocessing.RLock 對像,用來控制對value的訪問

感謝各位的閱讀,以上就是“python進(jìn)程間共享數(shù)據(jù)的方法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對python進(jìn)程間共享數(shù)據(jù)的方法這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI