不处理并发期货的Executor.map

时间:2017-03-05 19:54:51

标签: python-3.6 concurrent.futures

我无法理解为什么一个简单的执行器无法工作

我有两个模块:main.py

import other

a = [1, 2, 3]
b = ['a', 'b'] 
l = ['a', 'b', 'd']

other.run_executor(a, b, l)

other.py

from concurrent import futures
from multiprocessing import cpu_count


def do_stuff(a, b, c):
    print(a, b, c)


def run_executor(a, b, l):
    iterat = ((a, b, c) for c in l)
    with futures.ThreadPoolExecutor(max_workers=cpu_count() - 1) as e:
        e.map(do_stuff, iterat)

运行此代码不会引发任何错误,但也不会打印任何内容。 它打印a,b,l [0]; a,b,l [1]; a,b,l [2] 我做错了什么?

1 个答案:

答案 0 :(得分:1)

这是因为您没有正确使用ThreadPoolExecutor.map。参数不应作为一个迭代器传递,而应作为3个迭代器传递:

from concurrent import futures
from itertools import repeat
from multiprocessing import cpu_count


def do_stuff(a, b, c):
    print(a, b, c)


def run_executor(a, b, l):
    with futures.ThreadPoolExecutor(max_workers=cpu_count() - 1) as e:
        e.map(do_stuff, repeat(a), repeat(b), c)

此外,您应该在主脚本中使用if __name__ == "__main__"保护,以避免出现奇怪的行为。如果您尝试导入/拾取其中定义的函数,则允许保护模块主程序不被执行。

import other

if __name__ == "__main__":
    a = [1, 2, 3]
    b = ['a', 'b'] 
    l = ['a', 'b', 'd']

    other.run_executor(a, b, l)