以下简单的代码应该,据我所知,总是打印出'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 –