为了账号安全,请及时绑定邮箱和手机立即绑定

在多处理函数中使用管理器(用于池)(Windows 10)

在多处理函数中使用管理器(用于池)(Windows 10)

慕标5832272 2023-09-26 16:41:43
我正在从多处理中学习池、管理器等。我想在我的函数中使用 Manager 中的命名空间。我从互联网上获取了一些突出显示 Windows 中多处理管理器问题的代码。这里是:"""How to share data in multiprocessing with Manager.Namespace()"""from multiprocessing import Pool, Managerimport numpy as np# Create manager object in module-level namespacemgr = 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 typeconfig.a = 1config.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 funcdef 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 thecurrent process has finished its bootstrapping phase.This probably means that you are not using fork to start yourchild processes and you have forgotten to use the proper idiomin the main module:    if __name__ == '__main__':        freeze_support()        ...The "freeze_support()" line can be omitted if the programis not going to be frozen to produce an executable.我认为,问题在于管理器突然插入了一个全局变量。您无法在 Windows 上执行此操作。正如你所看到的,我正在防守主力,但这还不够。需要做的是将管理器以某种方式传递给函数(可能传递到映射变量中),但我不知道如何做到这一点。
查看完整描述

1 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

是的,看起来将管理器创建为全局会导致 Windows 上出现问题。将其移至模块 main 并将命名空间作为参数传递。Pool.map() 只允许将一个参数传递给工作线程,因此请将多个参数(包括命名空间)放入一个列表中。将参数列表的列表传递给 Pool.map()。


我可能是错的,但我认为你不应该期望/要求对象 ID 不改变。


from multiprocessing import Pool, Manager


import numpy as np



def func(a):

    """This is a function that we want our processes to call."""

    (config, i) = a

    # 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(config):

    """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, list([config, i] for i in range(20,25)))

    pool.close()

    pool.join()



if __name__ == "__main__":

    # 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]


    # Let's print the config

    print(config)

    # Now executing main()

    main(config)

    # 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)


查看完整回答
反对 回复 2023-09-26
  • 1 回答
  • 0 关注
  • 47 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信