我正在尝试同时生成多个进程,以便在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
如果你想用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。