![](/img/trans.png)
[英]Does tensorflow re-initialize weights when training in a for loop?
[英]Does multiprocess in python re-initialize globals?
我有一个多处理程序,我无法使用全局变量。 我有一个程序,这样开始: -
from multiprocessing import Process ,Pool
print ("Initializing")
someList = []
...
...
...
这意味着我有一些在我的main调用之前初始化的List变量。
稍后在代码中someList被设置为某个值,然后我创建4个进程来处理它
pool = Pool(4)
combinedResult = pool.map(processFn, someList)
pool.close()
pool.join()
在生成进程之前,someList设置为有效值。
然而,当这些过程产生时,我看到这个打印4次!! Initializing Initializing Initializing Initializing
正如在每个过程中清楚的那样,程序顶部的初始化部分被调用。 此外,someList设置为空。 如果我的理解是正确的,那么每个进程应该是当前进程状态的副本,这实际上意味着,我应该有4个相同列表的副本。 为什么全局变量再次重新初始化? 事实上,为什么该部分甚至被运行?
有人可以向我解释一下吗? 我提到了python docs,但无法确定根本原因。 他们建议不要使用全局变量并且我知道它,但它仍然没有解释对初始化函数的调用。 另外,我想使用多处理而不是多线程。 我试图了解多处理在这里是如何工作的。
谢谢你的时间。
在Windows中,进程不像Linux / Unix那样分叉 。 而是产生它们,这意味着为每个新的multiprocessing.Process
启动一个新的Python解释器。 这意味着所有全局变量都被重新初始化,如果你在某种程度上操纵它们,那么生成的进程就不会看到这一点。
解决这个问题的方法是将全局变量传递给Pool
initilaizer
,然后从那里生成global
也在生成的进程中:
from multiprocessing import Pool
def init_pool(the_list):
global some_list
some_list = the_list
def access_some_list(index):
return some_list[index]
if __name__ == "__main__":
some_list = [24, 12, 6, 3]
indexes = [3, 2, 1, 0]
pool = Pool(initializer=init_pool, initargs=(some_list,))
result = pool.map(access_some_list, indexes)
print(result)
在此设置中,您将全局变量复制到每个新进程,然后可以访问它们,但是,一如既往,从那里完成的任何更新都不会传播到任何其他进程。 为此你需要一些像正确的multiprocessing.Manager
。
作为额外的评论,从这里可以清楚地看出全局变量可能是危险的,因为很难理解它们将在不同的过程中采用什么值。
我认为重点在于,您正在创建4个进程,这些进程正在执行您提供的代码。 它们在同一个实例中工作,但执行相同的代码。
所以,也许你做多线程或你使用一些if子句等来确定哪个进程应该执行哪个代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.