0

关于以下代码片段的功能,我有几个问题。

 def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=10)             # start 10 worker processes
    result = pool.apply_async(f, [10])    # evaluate "f(10)" asynchronously
    print result.get(timeout=1)           
    print pool.map(f, range(10))          # prints "[0, 1, 4,..., 81]"
  1. 总而言之pool = Pool(processes=10),如果我在 4 个处理器架构(四核)上运行并实例化超过 4 个工作进程,因为在任何时间点只能执行多达 4 个进程,它甚至会有所不同吗?

  2. pool.map(f,range(10))函数中,如果我实例化 10 个工作进程,并且可能有 50 个映射器,python 是否会在它们完成执行时将映射器分配给进程,或者我应该弄清楚创建了多少个映射器并在线pool = Pool(processes=number_of_mappers)

这是我第一次尝试并行化任何东西,我非常困惑。所以任何帮助将不胜感激。

提前致谢!

4

2 回答 2

2
  1. 如果您创建的工作进程比可用的 CPU 多,那很好,但是这些进程会相互竞争周期。也就是说,您将浪费更多的周期,因为专门用于在进程之间切换的周期无助于让您更接近完成。对于 CPU 密集型任务,这只是浪费。但是,对于 I/O 密集型任务,它可能正是您想要的,因为在这种情况下,进程将花费大量时间空闲,等待阻塞 I/O 完成。

  2. 这些map函数会自动分割它们的可迭代参数并将其片段发送到所有工作进程。不过,我真的不知道你的意思mappersmappers您认为您在示例中创建了多少?10?1?还有什么?在你写的内容中,pool.map()阻塞直到所有工作完成。

于 2013-10-30T19:41:47.540 回答
1
  1. 您可以创建比 CPU 可以执行的线程数更多的工作线程。这在实时应用程序(如 Web 服务器)中是必需的,您必须确保每个客户端都能够与您通信,而无需等待其他客户端。如果它不是一个实时应用程序并且您只想尽快完成所有工作,那么创建尽可能多的线程会更明智,因为您的 CPU 可以同时处理。

  2. 无论您有多少工作,Python 都会负责将工作分配给工人。

于 2013-10-30T19:42:41.510 回答