Python进程池更新共享变量

dwbf0jvd  于 2023-05-05  发布在  Python
关注(0)|答案(1)|浏览(186)

据我所知,Python进程池不共享内存(参见this question)。相反,进程创建全局变量的副本。我被下面程序的结果搞糊涂了

import multiprocessing as mp

def worker_function(item):
    x.append(item)
    print(x)

if __name__ == '__main__':

    x = []

    pool = mp.Pool(16)
    jobs = []
    for item in range(10):
        job = pool.apply_async(worker_function, (item,))
        jobs.append(job)

    for job in jobs:
        job.get()

    pool.close()
    pool.join()

    print(f"x at the end of pool execution: {x}")

这个程序的输出是这样的

[0]
[0, 2]
[1]
[3]
[4]
[5]
[6]
[7]
[6, 8]
[9]
x at the end of pool execution: []

我的解释是,多处理库创建进程一次,并且在创建的开始只复制变量一次。如果两个函数在一个池上运行,它们之间将共享全局变量,并且第一个运行函数对全局变量的任何更新都将被第二个函数消耗。
有人能证实我的理解是否正确吗?

balp4ylt

balp4ylt1#

您创建了16个进程,但这并不意味着每个任务都将在自己的进程上运行。有些进程启动起来可能很慢,而且由于您的任务非常小,已经运行的进程可能会占用第二个任务。
在代码中,每个进程(而不是每个任务)都有自己的x。因此,如果多个任务在同一个进程上运行,它们将修改同一个x。所以你的结果。

相关问题