我正在从多处理中学习池、管理器等。我想在我的函数中使用 Manager 中的命名空间。我从互联网上获取了一些突出显示 Windows 中多处理管理器问题的代码。这里是:
"""How to share data in multiprocessing with Manager.Namespace()"""
from multiprocessing import Pool, Manager
import numpy as np
# Create manager object in module-level namespace
mgr = Manager()
# Then create a container of things that you want to share to
# processes as Manager.Namespace() object.
config = mgr.Namespace()
# The Namespace object can take various data type
config.a = 1
config.b = '2'
config.c = [1, 2, 3, 4]
def func(i):
"""This is a function that we want our processes to call."""
# You can modify the Namespace object from anywhere.
config.z = i
print('config is', config)
# And they will still be shared (i.e. same id).
print('id(config) = {:d}'.format(id(config)))
# This main func
def main():
"""The main function contain multiprocess.Pool codes."""
# You can add to the Namespace object too.
config.d = 10
config.a = 5.25e6
pool = Pool(1)
pool.map(func, (range(20, 25)))
pool.close()
pool.join()
if __name__ == "__main__":
# Let's print the config
print(config)
# Now executing main()
main()
# Again, you can add or modify the Namesapce object from anywhere.
config.e = np.round(np.random.rand(2,2), 2)
config.f = range(-3, 3)
print(config)
错误如下:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.
This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:
if __name__ == '__main__':
freeze_support()
...
The "freeze_support()" line can be omitted if the program
is not going to be frozen to produce an executable.
我认为,问题在于管理器突然插入了一个全局变量。您无法在 Windows 上执行此操作。正如你所看到的,我正在防守主力,但这还不够。需要做的是将管理器以某种方式传递给函数(可能传递到映射变量中),但我不知道如何做到这一点。
慕婉清6462132
相关分类