假设我有20个处理器可用。我想把参数传递给外部的 来自IPython的程序,一次最好运行4个线程,并使用map_async继续添加作业,直到所有作业完成。下面是示例代码,我相信一次只能为每个作业分配一个进程。这是一个使用' chunksize'旗?似乎会做相反的事情,即将多个作业发送到一个处理器。
ipcluster start -n 20 --daemon
import ipyparallel as ipp
import subprocess
def func(args):
""" function that calls external prog w/ 4 threads """
subprocess.call([some_external_program, args, nthreads=4])
args = [...]
ipyclient = ipp.Client().load_balanced_view()
results = ipyclient.map_async(func, args)
results.get()
答案 0 :(得分:1)
如果任务是多线程的,那么您不希望在太多引擎上运行它。如果这是您的大部分工作,最好是启动n_cpus/n_threads
引擎而不是n_cpus
(在20个CPU,4个线程的情况下为5个引擎)。如果您的工作的一部分是多线程的,那么您可能只想将他们的分配限制为n_cpus/n_threads
。您可以在创建视图时使用targets
参数执行此操作,这会将任务分配限制为引擎的子集:
n_threads = 4
client = ipp.Client()
all_view = client.load_balanced_view() # uses all engines
threaded_view = client.load_balanced_view(targets=client.ids[::n_threads])
这假设您在一台计算机上每个CPU有一个引擎。如果您使用的是多台计算机,或者引擎数与CPU数量的关系不同,则必须确定要使用的正确引擎子集。目标可以是任何手动指定的引擎ID列表。