在ipyparallel引擎中拆分作业以进行外部n线程调用

时间:2015-10-09 17:25:39

标签: ipython external ipython-parallel

问题

假设我有20个处理器可用。我想把参数传递给外部的 来自IPython的程序,一次最好运行4个线程,并使用map_async继续添加作业,直到所有作业完成。下面是示例代码,我相信一次只能为每个作业分配一个进程。这是一个使用' chunksize'旗?似乎会做相反的事情,即将多个作业发送到一个处理器。

启动IPython以外的引擎

ipcluster start -n 20 --daemon

IPython代码

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

1 个答案:

答案 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列表。