Python多处理:在函数内调用pool.map

Python多处理:在函数内调用pool.map,python,windows,function,python-3.x,multiprocessing,Python,Windows,Function,Python 3.x,Multiprocessing,我试图使用multiprocessing包在一个函数中使用多个CPU。当我在函数外运行一个玩具示例时,它会在四分之一秒内运行,不会出现任何问题(见下文) 但是,当我将相同的代码适配到函数中时(请参见下文),它会打印True,以指示\uuuuuuu name\uuuuuu='\uuuuuu main\uuuuuu',但它将永远运行,并且永远不会返回结果。我正在Windows7上运行Python 3.3 from multiprocessing import Pool import time st

我试图使用
multiprocessing
包在一个函数中使用多个CPU。当我在函数外运行一个玩具示例时,它会在四分之一秒内运行,不会出现任何问题(见下文)

但是,当我将相同的代码适配到函数中时(请参见下文),它会打印
True
,以指示
\uuuuuuu name\uuuuuu='\uuuuuu main\uuuuuu'
,但它将永远运行,并且永远不会返回结果。我正在Windows7上运行Python 3.3

from multiprocessing import Pool
import time

start = time.clock()

def f(x):
    return x*x

def testfunc(r):
    if __name__ == '__main__':
        print(True)
        with Pool(processes=7) as pool:     
            result = pool.map(f, range(r))

    return result

result = testfunc(1000)
print(time.clock() - start)

如果在错误的位置使用了

from multiprocessing import Pool
import time

start = time.clock()

def f(x):
    return x*x

def testfunc(r):
    print(True)
    with Pool(processes=7) as pool:     
        result = pool.map(f, range(r))
    return result

if __name__ == '__main__':
    result = testfunc(1000)
    print(time.clock() - start)
根据:

主模块的安全导入

确保新Python可以安全地导入主模块 在不引起意外副作用的情况下(如启动 新工艺)

。。。应使用if保护程序的“入口点” __名称\uuuu=='\ uuuuuu main\uuuuuuuuuuu':如下所示:


在调用
testfunc
的周围,尝试将
if uuuuuu name_uuuuuu=='\uuuuuuu main_uuu'
块放在函数外部。在上面提到的所有三个代码段中(上面2个,答案中1个),使用“with”会出现错误。这是
属性错误:\uuu退出\uu
。我甚至无法运行第一个示例。。。我遗漏了什么吗?你测试过这个代码吗?它给出了一个错误,说
AttributeError:\uuuu exit\uuuu
@PavithranIyer,您使用的是哪个版本的python?在发布时,我用Python3.3对其进行了测试。我认为您使用的是Python2.x。其中,
多处理.Pool
不是上下文管理器@PavithranIyer,如果您使用的是Python2.x,请尝试以下内容:(不使用上下文管理器)
from multiprocessing import Pool
import time

start = time.clock()

def f(x):
    return x*x

def testfunc(r):
    print(True)
    with Pool(processes=7) as pool:     
        result = pool.map(f, range(r))
    return result

if __name__ == '__main__':
    result = testfunc(1000)
    print(time.clock() - start)