以下簡單的代碼應該,據我所知,總是打印出'0'。但是,使用「lock = True」運行時,通常會打印出其他正數或負數。Python多處理共享變量不穩定的行爲
import multiprocessing as mp
import sys
import time
num = mp.Value('d', 0.0, lock = False)
def func1():
global num
print ('start func1')
#While num.value < 100000:
for x in range(1000):
num.value += 1
#print(num.value)
print ('end func1')
def func2():
global num
print ('start func2')
#while num.value > -10000:
for x in range(1000):
num.value -= 1
#print(num.value)
print ('end func2')
if __name__=='__main__':
ctx = mp.get_context('fork')
p1 = ctx.Process(target=func1)
p1.start()
p2 = ctx.Process(target=func2)
p2.start()
p1.join()
p2.join()
sys.stdout.flush()
time.sleep(25)
print(num.value)
任何人都可以提供任何解釋嗎?
澄清:當鎖定設置爲「False」時,它的行爲與預期的一樣,打印出'0',但是當它爲'True'時通常不會。
這對於更大的「範圍」值更爲常見/更常見。
使用python 3.6在兩個平臺(Mac OSx和Ubuntu 14.04.01)上進行了測試。
你使用的是什麼版本的python平臺?這兩種情況都像預期的那樣:https://ideone.com/JoBXwZ –
這是從您發佈的鏈接輸出:開始FUNC2 結束FUNC2 開始FUNC1 結束FUNC1 124.0 如果最終數量不爲0?這是如何預期的? – MHH
我已經運行了大約10次,最後總是得到0.0。我們必須生活在一個平行的宇宙中。 :D –