尝试理解Python的Concurrent.Futures模块

5
我正在尝试理解如何在Python 3.2.2中使用concurrent.futures模块,并且一直在尝试文档中的例子。但是当我尝试应用我的理解时,我的示例失败了。希望有人能帮助我找到正确的方法!我希望能够设置多个进程并行运行,但异步执行。我的进程不会返回任何内容。为了模拟这一点,我编写了一个微不足道的示例:
import concurrent.futures

fred = [1,2,3,4,5,6,7,8,9,10]

def f(x):
    print(x * x)

def main():
    with concurrent.futures.ProcessPoolExecutor() as executor:
        for num in fred:
            executor.submit(f, num)

if __name__ == "__main__":
    main()

这段代码在一个4核的Windows XP系统上运行并返回:
1 4 9 16 25
...但是之后就卡住了。
显然我做错了什么。那么,正确的Python进程池运行方式是什么?我不想使用executor.map方法,因为我没有从我的进程中得到任何返回值。
或者,我是否需要通过让进程返回True或False(或其他内容)来伪造它?
谢谢!

如果一个函数没有返回任何东西,那么它会隐式地返回 None - Brad Campbell
1个回答

2
我不太理解为什么你不想使用 executor.map......我试过一个没有返回值的函数(实际上是用你的 f 函数),它可以正常运行...
现在,当你使用 map 运行时,它实际上不会打印出值,但这里有一个版本的你的 f 函数可以打印出值:
import concurrent.futures

fred = [1,2,3,4,5,6,7,8,9,10]

def f(x):
    return x * x

with concurrent.futures.ProcessPoolExecutor() as executor:
    for num in executor.map(f, fred):
        print(num)

1
感谢 - 3.2版本中的map函数不会自动执行,您必须先要求它返回一些内容。我试图模拟一个更复杂的情况,在这种情况下,我的函数需要做很多工作,甚至可能会生成一个子进程,并将结果写入磁盘上的另一个文件。所以我可以让函数返回'True'或'False',但我还需要添加一行“虚假”的代码来使map函数正常工作。 - MappaGnosis
我认为你根本不需要让函数返回任何东西...我使用了executor.map和你原来的f函数,它并没有返回任何东西,但它完全可以正常工作(尽管数据没有被打印出来...) - user35288
我认为它不是这样工作的,因为我尝试了一种替代方法,在函数中放置了一个time.sleep(x)调用,然后计时整个操作。代码执行等待和不等待所需的时间相同。文档说明3.2中的'map'工作方式不同 - 这就是为什么我必须做一些事情来使'map'实际执行函数的原因。 - MappaGnosis

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