python期货和元组解包

python期货和元组解包,python,future,dask,iterable-unpacking,concurrent.futures,Python,Future,Dask,Iterable Unpacking,Concurrent.futures,什么是实现未来元组解包之类的功能的一种冗长/惯用的方法 我有这样的代码 a, b, c = f(x) y = g(a, b) z = h(y, c) 我想把它转换成期货。 理想情况下,我想写一些 a, b, c = ex.submit(f, x) y = ex.submit(g, a, b) z = ex.submit(h, y, c) afuture = ex.submit(f, x) a,b,c = afuture.result() ... 第一行抛出 TypeError: 'Futu

什么是实现未来元组解包之类的功能的一种冗长/惯用的方法

我有这样的代码

a, b, c = f(x)
y = g(a, b)
z = h(y, c)
我想把它转换成期货。 理想情况下,我想写一些

a, b, c = ex.submit(f, x)
y = ex.submit(g, a, b)
z = ex.submit(h, y, c)
afuture = ex.submit(f, x)
a,b,c = afuture.result()
...
第一行抛出

TypeError: 'Future' object is not iterable
不过。 我如何获得
a、b、c
,而不必另外打3个
ex.submit
电话?也就是说,我希望避免将此写为:

import operator as op
fut = ex.submit(f, x)
a = client.submit(op.getitem, fut, 0)
b = client.submit(op.getitem, fut, i)
c = client.submit(op.getitem, fut, 2)
y = ex.submit(g, a, b)
z = ex.submit(h, y, c)

我想一个可能的解决方案是编写一个
unpack
函数,如下所示

import operator as op
def unpack(fut, n):
    return [client.submit(op.getitem, fut, i) for i in range(n)]

a, b, c = unpack(ex.submit(f, x), 3)
y = ex.submit(g, a, b)
z = ex.submit(h, y, c)
哪种方法有效:例如,如果您首先定义:

def f(x):
    return range(x, x+3)
x = 5
g = op.add
h = op.mul
然后你得到

z.result() #===> 77
我想这样的事情可能已经存在了


以上仅适用于
dask.distributed.Future
。它不适用于普通的
并发.futures.Future

快速浏览:

建议您必须执行以下操作

a, b, c = ex.submit(f, x)
y = ex.submit(g, a, b)
z = ex.submit(h, y, c)
afuture = ex.submit(f, x)
a,b,c = afuture.result()
...
submit
返回一个
Future
对象,而不是运行
f(x)
的结果

这一答案表明,链接期货并非微不足道:


“抛出一个错误。什么错误?@JohnZwinck
TypeError:“Future”对象不可iterable
运算符。itemgetter
可以获取多个项目。但看看它的代码;它是一个进行迭代的类。@hpaulj Thatnks!对索引的迭代是可以的,对未来的迭代才是最初的问题。上面的方法迭代索引,但是组件的提取通过
submit
调用延迟,所以它是可以的。@hpaulj啊,但是
itemgetter
在这里不起作用,因为如果我将cal延迟到它,我仍然会得到一个iterable的未来,但是我需要一个iterable的未来。
unpack
使用
getitem
将一个iterable的未来转变为元素未来的iterable,这就是解包赋值工作的原因。
afuture.result()
调用将阻止对
f
的调用,这违背了使用未来的目的。@DanielMahler,你能给我们举一个不用拆包的链锁的例子吗?听起来你已经用
期货
做了一些基本的工作。启发我们。这3个额外的电话是什么?