我的理解是concurrent.futures依靠酸洗参数让它们在不同的进程(或线程)中运行。不应该酸洗创建一个参数的副本?在Linux上它似乎没有这样做,即,我必须明确地传递一份副本。为什么concurrent.futures没有提供参数副本?
我想作以下结果的意义:
<0> rands before submission: [17, 72, 97, 8, 32, 15, 63, 97, 57, 60]
<1> rands before submission: [97, 15, 97, 32, 60, 17, 57, 72, 8, 63]
<2> rands before submission: [15, 57, 63, 17, 97, 97, 8, 32, 60, 72]
<3> rands before submission: [32, 97, 63, 72, 17, 57, 97, 8, 15, 60]
in function 0 [97, 15, 97, 32, 60, 17, 57, 72, 8, 63]
in function 1 [97, 32, 17, 15, 57, 97, 63, 72, 60, 8]
in function 2 [97, 32, 17, 15, 57, 97, 63, 72, 60, 8]
in function 3 [97, 32, 17, 15, 57, 97, 63, 72, 60, 8]
下面的代码:
from __future__ import print_function
import time
import random
try:
from concurrent import futures
except ImportError:
import futures
def work_with_rands(i, rands):
print('in function', i, rands)
def main():
random.seed(1)
rands = [random.randrange(100) for _ in range(10)]
# sequence 1 and sequence 2 should give the same results but they don't
# only difference is that one uses a copy of rands (i.e., rands.copy())
# sequence 1
with futures.ProcessPoolExecutor() as ex:
for i in range(4):
print("<{}> rands before submission: {}".format(i, rands))
ex.submit(work_with_rands, i, rands)
random.shuffle(rands)
print('-' * 30)
random.seed(1)
rands = [random.randrange(100) for _ in range(10)]
# sequence 2
print("initial sequence: ", rands)
with futures.ProcessPoolExecutor() as ex:
for i in range(4):
print("<{}> rands before submission: {}".format(i, rands))
ex.submit(work_with_rands, i, rands[:])
random.shuffle(rands)
if __name__ == "__main__":
main()
在地球上是[97, 32, 17, 15, 57, 97, 63, 72, 60, 8]
来自哪里?这甚至不是传递给submit
的序列之一。
结果的Python 2.
我有一个解决方案(明确的副本)。我只是困惑于我得到的结果(1)为什么它在泡菜时不制作副本,如果是酸洗和(2)“[97,32,17,15,57, 97,63,72,60,8]''来自。 – ariddell
它来自洗牌,洗牌多次改变列表,直到洗牌实际完成,我更新了答案,以解释它可能已经混乱 –
我对文档的阅读是没有共享数据,即每个参数是腌制和分开发送。这是我混淆的根源,是什么促成了这个问题。 – ariddell