__main__上的 Python 全局变量

Python global variable on __main__

提问人:J. Doe 提问时间:10/6/2023 最后编辑:wjandreaJ. Doe 更新时间:10/6/2023 访问量:134

问:

由于需要将多处理放在 Windows 中,我发现我的全局变量没有传递给我的函数。__main__

from multiprocessing import Pool, Value

def Proses(lines):
    global xyz
    try:
        print(lines)
        print(xyz)
    except Exception as e:
        print(e)

def counter_handler(args):
    global counter
    counter = args

def Dosomething():
    a = [i for i in range(10)]
    return a


if __name__ == '__main__':
    # i want to share xyz variable
    xyz = Dosomething()

    threads = []
    data = ["bjir", "bjir", "bjir"]
    counter = Value('i', 0)
    with Pool(1) as pool:
        p = Pool(1, initializer=counter_handler, initargs=(counter,))
        i = p.map_async(Proses, data, chunksize=1)
        i.wait()

一直在寻找几个小时,但仍然没有线索,我认为这可能是一个重复的问题,我知道,但我仍然找不到任何答案。有没有办法将我的变量传递给我的函数?xyz

python-3.x python-多处理 全球

评论

0赞 Tim Roberts 10/6/2023
如果将该行移出语句之前,则它将起作用。它们不是共享的 -- 每个进程都有自己的副本。xyz = Dosomething()if

答:

0赞 Andrej Kesely 10/6/2023 #1

正如您在示例中所写的,has 和 参数,您也可以使用它们来初始化全局变量:Poolinitializer=initargs=

from multiprocessing import Pool, Value


def Proses(lines):
    global xyz

    print(lines)
    print(xyz)


def Dosomething():
    a = [i for i in range(10)]
    return a


def init_pool(a, cnt):
    global xyz, counter
    xyz = a
    counter = cnt


if __name__ == "__main__":
    # i want to share xyz variable
    xyz = Dosomething()

    data = ["bjir", "bjir", "bjir"]
    counter = Value("i", 0)

    with Pool(1, initializer=init_pool, initargs=(xyz, counter)) as pool:
        i = pool.map_async(Proses, data, chunksize=1)
        i.wait()

指纹:

bjir
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
bjir
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
bjir
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

评论

0赞 J. Doe 10/6/2023
我使用了 functoin counter_handler因为我的程序需要一个计数器,所以我可以;删除该部分。 我尝试在 initargs 上传递 2 个变量,但它仍然没有定义
1赞 Andrej Kesely 10/6/2023
@J.Doe 我已经更新了我的答案。