Python多处理:限制使用的核心数

aba*_*ter 7 python multiprocessing

我想知道如何将N个独立任务分配给具有L个核心的机器上的M个处理器,其中L> M. 我不想使用所有处理器,因为我仍然希望I/O可用.我试过的解决方案似乎被分发到所有处理器,使系统陷入困境.

我假设多处理模块是可行的方法.

我做数值模拟.我的背景是物理学,而不是计算机科学,所以不幸的是,我经常不完全理解涉及标准任务模型的讨论,如服务器/客户端,生产者/消费者等.

以下是我尝试过的一些简化模型:

假设我有一个run_sim(**kwargs)运行模拟的函数(参见下面的内容),以及用于模拟的一长串kwargs,我有一个8核机器.

from multiprocessing import Pool, Process

#using pool
p = Pool(4)
p.map(run_sim, kwargs)

# using process
number_of_live_jobs=0
all_jobs=[]
sim_index=0
while sim_index < len(kwargs)+1:
   number_of_live_jobs = len([1 for job in all_jobs if job.is_alive()])
   if number_of_live_jobs <= 4:
      p = Process(target=run_sim, args=[], kwargs=kwargs[sim_index])
      print "starting job", kwargs[sim_index]["data_file_name"]
      print "number of live jobs: ", number_of_live_jobs
      p.start()
      p.join()
      all_jobs.append(p)
      sim_index += 1
Run Code Online (Sandbox Code Playgroud)

当我用"顶部"然后"1"查看处理器使用情况时,无论如何,所有处理器似乎都被使用了.我错误地解释了"top"的输出并不是不可能的,但如果run_simulation()处理器密集,那么机器会严重陷入困境.

假设模拟和数据:

# simulation kwargs
numbers_of_steps = range(0,10000000, 1000000)
sigmas = [x for x in range(11)]
kwargs = []
for number_of_steps in numbers_of_steps:
   for sigma in sigmas:
      kwargs.append(
         dict(
            number_of_steps=number_of_steps,
            sigma=sigma,
            # why do I need to cast to int?
            data_file_name="walk_steps=%i_sigma=%i" % (number_of_steps, sigma),
            )
         )

import random, time
random.seed(time.time())

# simulation of random walk
def run_sim(kwargs):
   number_of_steps = kwargs["number_of_steps"]
   sigma = kwargs["sigma"]
   data_file_name = kwargs["data_file_name"]
   data_file = open(data_file_name+".dat", "w")
   current_position = 0
   print "running simulation", data_file_name
   for n in range(int(number_of_steps)+1):
      data_file.write("step number %i   position=%f\n" % (n, current_position))
      random_step = random.gauss(0,sigma)
      current_position += random_step

   data_file.close()
Run Code Online (Sandbox Code Playgroud)

ter*_*nus 2

您可能想查看以下包:

http://pypi.python.org/pypi/affinity

它是一个使用 sched_setaffinity 和 sched _getaffinity 的包。

缺点是它是高度 Linux 特定的。