我的测试脚本test.py
如下:
import time
from multiprocessing import Pool
n = []
print('global', id(n))
def slowf():
global n
time.sleep(5)
n.append(1)
print('slowf---', n, id(n))
def checkn():
global n
while 1:
if n:
print('checkn', n, id(n), "T")
break
else:
print('checkn', n, id(n), "F")
time.sleep(1)
def main():
global n
p = Pool()
p.apply_async(slowf, args=())
p.apply_async(checkn, args=())
p.close()
p.join()
if __name__ == '__main__':
main()
在python3.6
中运行的脚本的输出是:
global 4534751304
checkn [] 4534751304 F
checkn [] 4534751304 F
checkn [] 4534751304 F
checkn [] 4534751304 F
checkn [] 4534751304 F
slowf--- [1] 4534751304
checkn [] 4534751304 F
checkn [] 4534751304 F
checkn [] 4534751304 F
checkn [] 4534751304 F
checkn [] 4534751304 F
......
那么,为什么slowf()
函数在5秒后更改了全局变量n
,但它仍然在checkn()
函数中读取[]
。它们只是以相同的id
进入全局变量n
。我只是糊涂了
如果有人能给我解释一下我会很感激的! 谢谢转发
单独的进程不共享内存。你在一个孩子身上所做的改变在另一个孩子身上看不到
The docs解释这一点,以及为什么您通常不希望共享状态(您需要添加同步,这很难正确实现),以及您可以做些什么
You can use explicit shared memory, but only with basic "C types" like 32-bit integers or arrays of floats。然后必须在正确的位置使用显式同步,如
Lock
,以确保代码的安全如果可能的话,理想的解决方案是将代码重新设计为pass data over queues instead of sharing it
如果这不适合您的问题,那么可以使用^{} ,它基本上是在队列顶部伪造共享的高级Python对象。对于某些用途来说,这可能会非常慢,但如果不是这样,这可能是最简单的答案
相关问题 更多 >
编程相关推荐