据我所知,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: []
我的解释是,多处理库创建进程一次,并且在创建的开始只复制变量一次。如果两个函数在一个池上运行,它们之间将共享全局变量,并且第一个运行函数对全局变量的任何更新都将被第二个函数消耗。
有人能证实我的理解是否正确吗?
1条答案
按热度按时间balp4ylt1#
您创建了16个进程,但这并不意味着每个任务都将在自己的进程上运行。有些进程启动起来可能很慢,而且由于您的任务非常小,已经运行的进程可能会占用第二个任务。
在代码中,每个进程(而不是每个任务)都有自己的
x
。因此,如果多个任务在同一个进程上运行,它们将修改同一个x
。所以你的结果。