在一定数量的核心上进行多进程处理

3
在下面的代码中,Function是要调用的函数,我该如何指定要使用的处理器数量为10?
  if __name__ == '__main__':
        jobs = []

        for l in lst:
           p = multiprocessing.Process(target=Function, args=(l,))
           jobs.append(p)
           p.start()

这段代码将完全掌控我的服务器,那我该如何将其限制为仅使用十个内核?我应该将其放入循环中吗?

2个回答

4
鉴于您基本上是在将函数映射到变量列表上,我建议您使用 multiprocessing.Pool 代替。这是一个类,它创建有限数量的工作线程池,可以用来在输入列表上运行函数,而不是像Process一样为每个函数调用创建一个线程,然后同时运行它们。

在Python版本小于3.3中使用的示例代码如下:

from multiprocessing import Pool
import contextlib

num_threads = 10

with contextlib.closing( Pool(num_threads) ) as pool:
    results = pool.map(Function, lst)

如果您使用的是Python 3,那么Pool类默认可以使用上下文管理器,代码简化为:

from multiprocessing import Pool

num_threads = 10

with Pool(num_threads) as pool:
    results = pool.map(lst)

哇!这太有帮助了!它工作得很好,但似乎不想将函数输出写入文件。函数以一个o.write()语句结束,但现在没有被执行。我是否需要额外的代码确保输出被写入文件? - poppyseeds
1
这里的o是每次调用函数时打开的文件吗?如果是,我猜可能发生的情况是任何写入缓冲区都没有刷新到磁盘。在调用o.write()后尝试添加o.flush()调用。如果不是这个问题,我需要看一下你的函数代码才能提供更具体的建议。 - Simon Gibbons

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接