Python 基于以前的任务结果修改Dask任务图

Python 基于以前的任务结果修改Dask任务图,python,dask,Python,Dask,我有两项任务;一个慢一个快。这些任务在各自的数据上迭代运行。我偶尔会根据更快任务的输出执行检查,在某些情况下,检查会告诉我交换两个源的数据 我想做的是在等待缓慢的任务时,让这个工作流运行,而不需要不必要的阻塞。我想到的实现这一点的第一种方法是Dask正在执行的基础DAG依赖于其中一个任务的输出。如果check任务说我不需要交换数据,那么我可以立即运行下一个fast\u data\u任务。这个想法在这些DAG中得到了说明:黑色DAG是阻塞版本,如果我们假设check表示不交换数据,则红色DAG是非

我有两项任务;一个慢一个快。这些任务在各自的数据上迭代运行。我偶尔会根据更快任务的输出执行检查,在某些情况下,检查会告诉我交换两个源的数据

我想做的是在等待缓慢的任务时,让这个工作流运行,而不需要不必要的阻塞。我想到的实现这一点的第一种方法是Dask正在执行的基础DAG依赖于其中一个任务的输出。如果
check
任务说我不需要交换数据,那么我可以立即运行下一个
fast\u data\u任务。这个想法在这些DAG中得到了说明:黑色DAG是阻塞版本,如果我们假设
check
表示不交换数据,则红色DAG是非阻塞的,如果我们假设
check
表示应该交换数据,则蓝色DAG是非阻塞的。Dask中是否有方法根据以前任务的结果修改任务依赖关系?(或者是否有其他机制可以达到同样的效果?)

另一种可能的方法是,如果我真的可以将
未来的
发送给员工;i、 例如,发送对结果的引用,而不是结果本身。在这种情况下,更新任务可能取决于
check
的布尔结果和两个“未来引用”。这些“未来引用”永远不会被阻塞(它们只是用于提供任务图的正确输入/输出;结果的实际内容不会用于更新任务)。更新任务返回的
未来
将只是对正确者的引用。然而,我不知道这样的事情是否可能与达斯克

下面是一个使用阻塞(黑色DAG)的示例代码。我希望它可以被修改以得到相同的结果,但不要在等待
slow\u data\u任务
完成时在“更新”阶段阻塞。(另外,我希望避免阻塞以后运行的
其他任务
——这种交换只是更大任务图的一部分!)

导入分布式
导入时间
将numpy作为np导入
def慢速数据任务(输入数据):
时间。睡眠(5)
返回输入数据
def快速数据任务(输入数据):
返回输入数据
定义其他任务(输入数据):
返回输入数据
def检查(fast_数据):
do_mixing=np.random.choice([True,False])
返回快速\u数据,进行\u混合
def更新快速数据(检查结果、慢速数据):
快速数据,需要=检查结果
如有需要:
快速数据=慢速数据
返回快速数据
def更新慢数据(检查慢数据的结果):
快速数据,需要=检查结果
如有需要:
慢数据=快数据
返回慢速数据
client=distributed.client()
快速_数据='foo'
慢_数据='bar'
其他_数据='qux'
n_迭代次数=2
对于范围内的迭代(n_迭代):
slow\u data=client.submit(slow\u data\u任务,slow\u数据)
fast\u data=client.submit(fast\u data\u任务,fast\u数据)
其他_数据=client.submit(其他_任务、其他_数据)
检查结果=客户端。提交(检查,快速数据)
新建快速数据=客户端。提交(更新快速数据、检查结果、慢数据)
新建慢数据=客户端。提交(更新慢数据、检查慢数据、慢数据)
快速数据=新的快速数据
慢速数据=新的慢速数据
更多细节 我提出了一种适用于这个玩具系统的方法,但在我的实际用例中失败了。这将是将任务的输出更改为
(数据,任务类型)
,其中
任务类型为['fast','slow']
,并将
快速数据任务
慢速数据任务
替换为
数据任务
,其内部行为取决于
任务类型
的值。只有1个交换耦合,这就行了。但在实际系统中,许多不同的数据源(快、慢、快、慢)之间可能存在耦合,这种方法将无法知道哪些数据将是交换中的其他数据。(检查
任务取决于其他数据源的名称,即
“慢”
,即使它不取决于特定数据。)