0

更新:将我的 Spyder 更新到 5.0.5 后它正在工作。感谢大家!

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

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

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

这是add_one来自的函数Testing.test

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()
4

1 回答 1

0

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

import multiprocessing
import numpy as np
import pandas as pd
from Testing.test import add_one
于 2021-09-07T06:27:35.827 回答