【问题标题】:Python multiprocessing can't use functions from other modulePython多处理不能使用来自其他模块的函数
【发布时间】:2021-09-07 06:12:29
【问题描述】:

更新:将我的 Spyder 更新到 5.0.5 后它可以工作了。谢谢大家!

我正在尝试使用多处理来加速循环。下面的代码旨在生成 10000 个随机向量。

我的想法是将任务拆分为5个进程并存储在result中。但是,当我运行代码时,它返回了一个空列表。

但是,如果我在 randomize_data 函数中删除 result = add_one(result),代码运行完美。因此,错误一定来自在多处理中使用其他模块 (Testing.test) 中的函数。

这是来自Testing.testadd_one 函数:

def add_one(x):
    return x+1

如何在进程内使用其他模块的功能?谢谢。

import multiprocessing
import numpy as np
import pandas as pd

def randomize_data(mean, cov, n_init, proc_num, return_dict):
    result = pd.DataFrame()
    for _ in range(n_init):
        temp = np.random.multivariate_normal(mean, cov)
        result = result.append(pd.Series(temp), ignore_index=True)
    
    result = add_one(result)
    return_dict[proc_num] = result

if __name__ == "__main__":

    from Testing.test import add_one

    mean = np.arange(0, 1, 0.1)
    cov = np.identity(len(mean))
    
    manager = multiprocessing.Manager()
    return_dict = manager.dict()
    jobs = []
    
    for i in range(5):
        p = multiprocessing.Process(target=randomize_data, args=(mean, cov, 2000, i, return_dict, ))
        jobs.append(p)
        p.start()
    
    for proc in jobs:
        proc.join()
    
    result = return_dict.values()

【问题讨论】:

    标签: python multiprocessing python-multiprocessing multiprocessing-manager


    【解决方案1】:

    这里的问题很明显: 您在本地范围内导入了 add_one,而不是在全局范围内。因此,对这个函数的引用只存在于你的 main-if 中。 将此导入语句移到文件顶部的其他语句中,您的代码应该可以工作。

    import multiprocessing
    import numpy as np
    import pandas as pd
    from Testing.test import add_one
    

    【讨论】:

    • 嗯,现在编译需要很长时间。自从您回答以来,我的 spyder 还没有完成程序的编译。这里有版本问题吗?我正在使用 Python 3.7.6
    • 好吧,目前这似乎毫无意义。 Python 版本不应该与此相关。您的代码中某处有无限循环吗?
    • 不,我运行的代码与我在此处发布的完全相同。我注意到一些有趣的事情,如果我第一次打开 Spyder 并运行这段代码,编译需要很长时间。但是如果我重新启动我的 Spyder 控制台并再次运行此代码,它运行得很好。奇怪
    • 尝试另一个 IDE,可能是 Spyder 的问题。但对我来说,嵌入我的答案的代码也可以工作并终止。
    • 不,你的解释不正确。在 OP 的原始代码中执行语句 from Testing.test import add_one 后,add_one 应该可供randomize_data 调用。如果您打印出dir(sys.modules['__main__']),您将看到randomize_dataadd_one
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多