Python 3.x python Concurrent Futures每次都会给出不同的结果

Python 3.x python Concurrent Futures每次都会给出不同的结果,python-3.x,parallel-processing,concurrent.futures,Python 3.x,Parallel Processing,Concurrent.futures,我很困惑为什么concurrent.futures模块每次都给我不同的结果。我有一个函数,比如foo(),它运行在更大数据集d的段上 我总是将这个较大的数据集分解成若干部分,并列出一个列表 d_部分=[d1、d2、d3,…] 然后根据文档,我做了以下工作 results = [executor.submit(foo, d) for d in d_parts] 它应该给我一个“未来”对象的列表,顺序是foo(d1),foo(d2),等等 然而,当我试图用 done, _ = concurrent

我很困惑为什么concurrent.futures模块每次都给我不同的结果。我有一个函数,比如foo(),它运行在更大数据集d的段上

我总是将这个较大的数据集分解成若干部分,并列出一个列表
d_部分=[d1、d2、d3,…]

然后根据文档,我做了以下工作

results = [executor.submit(foo, d) for d in d_parts]
它应该给我一个“未来”对象的列表,顺序是
foo(d1),foo(d2)
,等等

然而,当我试图用

done, _ = concurrent.futures.wait(results)
存储在
done
中的结果列表似乎是无序的,即它们不是
foo(d1)、foo(d2)
的返回,而是一些不同的顺序。因此,在同一数据集上多次运行此程序会产生不同的结果,因为不确定的结果是哪个先完成(d1、d2的大小大致相同),既然
wait()
似乎应该保留提交作业的顺序,那么有什么原因吗?
谢谢

如果顺序很重要,也许您可以枚举_部分并将索引传递给foo,该索引在返回时也会回显。因此,要在results=[executuor.submit..]部分中枚举,请将索引传递给foo,然后手动重新排序?我只是想确认一下。(这听起来真是个好主意。谢谢!)是的,不过这只是我的第一反应。谢谢Jon,我想知道你是否知道在并发过程中是否知道订单的洗牌。futures.wait()?我知道使用concurrent.futures.as_completed()在期货完成时返回期货(因此订单可能会被洗牌),但我不认为等待方法是这样的……我认为订单只是每个完成的订单,而不是他们提交的订单。我猜同样的管道也用于
wait()
as_completed()
,但这纯粹是我的猜测。