自定义函数中的python多处理

问题描述 投票:0回答:1

我正在尝试同时生成多个进程,以便在python中实现自定义集群功能。我已经构建了五个基本上实现网格搜索的功能,并且需要一些时间才能完成。我已经研究了多处理,我已经调整了一些代码,但是我遇到了两件事情。似乎即使看起来我已经正确地设置了多处理,这些过程仍然是顺序发生的。我无法弄清楚访问多处理Process类返回的值的最佳方法,看起来像使用return更新字典似乎是解决该问题的一个很好的解决方案。所以我的主要问题是;我是否正确设置了多处理/多线程?我怎么检查?

下面的代码是我当前结构的简化版本

def Optimal_Search(brc = "brc", ms='ms', agg = 'agg', db = 'db', km = 'km'):
    import time
    start_time = time.time()

    def f(name):
        print ('hello', name)
        return ('hello', name)

    if __name__=='__main__':
        brc_params = Process(target = f(name = brc))
        brc_params.start()
        ms_params = Process(target = f(name = ms))
        ms_params.start()
        agg_params = Process(target = f(name = agg))
        agg_params.start()
        db_params = Process(target = f(name = db))
        db_params.start()
        km_params = Process(target = f(name = km))
        km_params.start()

    print("--- %s seconds ---" % (time.time() - start_time))
    print(brc_params, ms_params, agg_params, db_params, km_params)

    return brc_params, ms_params, agg_params, db_params, km_params
python-3.x parallel-processing python-multiprocessing python-multithreading task-queue
1个回答
1
投票

如果你想用multiprocessing这样做,我认为你需要用Process(target=f('brc'))替换p = Process(target=f, args=('brc', ))。否则,f将在被传递到Process之前进行评估。

但是,听起来您希望它在群集上运行,在这种情况下,多处理将无法工作。我建议用Ray编写代码,以便它可以在一台机器和一个集群上运行。

您可以按如下方式构建它。

import ray
import sys

ray.init()

@ray.remote
def f(name):
    print('hello', name)
    sys.stdout.flush()
    return 'hello', name

# Launch the tasks in parallel on different worker processes.
result_ids = []
for name in ['brc', 'ms', 'agg', 'db', 'km']:
    result_ids.append(f.remote(name))

# Retrieve the results.
results = ray.get(result_ids)

请注意,如果您正在进行网格搜索或任何形式的超参数搜索,您可能会发现Ray's built in library for hyperparameter tuning非常有用。

Documentation for Ray。注意我正在帮助开发Ray。

© www.soinside.com 2019 - 2024. All rights reserved.