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-statement をファイルの先頭にある他のものに移動すると、コードが機能するはずです。

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