您好,登錄后才能下訂單哦!
這篇文章主要講解了“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é)果:
注意看紅色框住的內(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)注!
免責(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)容。