gpt4 book ai didi

python - 在Python中检查另一个函数时在函数中设置全局变量的值

转载 作者:太空宇宙 更新时间:2023-11-03 13:58:52 24 4
gpt4 key购买 nike

我的测试脚本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。我只是很困惑!

最佳答案

单独的进程不共享内存。您对一个 child 所做的更改在另一个 child 中将不可见。

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 .

如果这不适合您的问题,您可以使用 Manager ,它基本上在队列顶部伪造了共享的高级 Python 对象。对于某些用途来说,这可能会非常慢,但如果不是这样,它可能是最简单的答案。

关于python - 在Python中检查另一个函数时在函数中设置全局变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49398869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com