关于以下代码片段的功能,我有几个问题。
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]"
在pool = Pool(processes=10)
行中,如果我在4处理器架构(四核)上运行并实例化4个以上的工作进程,它甚至会有所作为,因为最多只能执行4个进程在任何时间点?
在pool.map(f,range(10))
函数中,如果我实例化10个工作进程,并且可能有50个映射器,python会在完成执行时处理为进程分配映射器,或者我应该弄清楚有多少映射器创建并实例化行pool = Pool(processes=number_of_mappers)
中的许多进程?。
这是我第一次尝试并行化任何事情,我对此感到非常困惑。所以任何帮助都会非常感激。
提前致谢!
答案 0 :(得分:2)
如果您创建的工作进程多于可用CPU的工作进程数,那很好,但这些进程会相互竞争循环。也就是说,你将浪费更多的周期,因为专注于在流程之间切换的周期不会让你更接近完成。对于CPU绑定的任务,它只是浪费。但是,对于I / O绑定的任务,它可能正是您想要的,因为在这种情况下,进程将花费大量的时间空闲,等待阻止I / O完成。
map
函数自动切片可迭代参数并将其中的部分发送给所有工作进程。不过,我真的不知道mappers
你的意思。您认为自己在示例中创建了多少mappers
? 10? 1?别的什么?在你写的内容中,pool.map()
会阻止所有工作完成。
答案 1 :(得分:1)
您可以创建比CPU可以执行的线程数更多的工作者。这在实时应用程序中是必需的,例如Web服务器,您必须确保每个客户端都能够与您通信而无需等待其他人。如果它不是一个实时应用程序而你只想尽快完成所有工作,那么创建尽可能多的线程会比你的CPU同时处理更明智。
无论您有多少工作,Python都会为工作人员分配工作。