在python中签入另一个函数时,在函数中设置全局变量的值

2024-09-30 00:23:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我的测试脚本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。我只是糊涂了

如果有人能给我解释一下我会很感激的! 谢谢转发


Tags: import脚本idasynciftimemaindef
1条回答
网友
1楼 · 发布于 2024-09-30 00:23:46

单独的进程不共享内存。你在一个孩子身上所做的改变在另一个孩子身上看不到

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对象。对于某些用途来说,这可能会非常慢,但如果不是这样,这可能是最简单的答案

相关问题 更多 >

    热门问题