concurrent.futures 在 Python 中的多线程不工作

Multithreading with concurrent.futures in Python not working

我正在尝试让多线程在我的程序中工作。但它从不执行我的辅助函数 functionNamefuture.done() 总是返回 False 并且永远不会打印文本 "function entered"。

def functionName(par1, par2, par3):
    print("function entered")

with ThreadPoolExecutor(max_workers=2) as executor: 
    for x in items:      #this loops 8000 times
        future = executor.submit(functionName, parameter1, parameter2, parameter3)
        if future.done():
            print("true")

并发很难。幸运的是,Python 的 concurrent.futures module manages to nicely decouple the workers (result producers) from the main program (result consumers) via concept of futures。此外,执行器(线程池或进程池)将为您处理 thread/process 产生、同步和加入的所有脏细节。

将作业提交给执行者后,您收到的未来将掌握结果。 Non-blocking 状态检查通过 future.done() and blocking obtaining of the result with future.result() 完成。

解决期货和提供结果的确切顺序是不确定的(除非你运行宁一些 real-time OS),并且取决于操作系统的 thread/process调度器。此外,由于您在提交作业后会立即检查 .done(),因此到那时作业可能还没有真正完成。如果您的辅助函数比示例中的更复杂,则很可能不会。当我 运行 你的例子时,它在大约 50% 的时间内完成(true 打印了几次)。

但是,要等待和迭代结果,以便它们变得可用(不一定按照它们提交的顺序),您可以使用 concurrent.futures.as_completed

例如:

from concurrent.futures import ThreadPoolExecutor, as_completed

def function(param):
    return "function result for param: %s" % param

with ThreadPoolExecutor(max_workers=2) as executor:
    futures = [executor.submit(function, x) for x in [1,2,3]]

for future in as_completed(futures):
    print(future.result())

这输出:

function result for param: 1
function result for param: 3
function result for param: 2

另一种方法是提交所有任务,然后遍历所有 futures,对所有任务进行阻塞结果提取,按提交顺序:

# submit all
...
# read results in order
for future in futures:
    print(future.result())

但这在某种程度上违背了异步期货的目的。不完全是,假设当您将所有 8000 个任务排入队列时,第一个任务将完成。但这是很多不必要的假设。使用 as_completed.