Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Dask如何决定是否重新运行任务_Python_Dask_Dask Distributed - Fatal编程技术网

Python Dask如何决定是否重新运行任务

Python Dask如何决定是否重新运行任务,python,dask,dask-distributed,Python,Dask,Dask Distributed,我对Dask非常陌生,正在尝试构建一个系统来执行具有依赖关系的计算图。然而,我非常困惑的是,有些任务被执行了两次,尽管它们有一个静态签名。例如: Python 3.7.5 (default, Nov 12 2019, 11:34:05) [GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux Type "help", "copyright", "credits" or "license" for more information. >>>

我对Dask非常陌生,正在尝试构建一个系统来执行具有依赖关系的计算图。然而,我非常困惑的是,有些任务被执行了两次,尽管它们有一个静态签名。例如:

Python 3.7.5 (default, Nov 12 2019, 11:34:05)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from dask.distributed import Client
>>> client = Client()
>>> def a():
...   print("a")
...
>>> client.gather(client.submit(a))
a
>>> client.gather(client.submit(a))
a
>>> client.submit(a)
<Future: pending, key: a-a5eb50e9015acdf60b1094aa4e467e00>
a
>>> client.submit(a)
<Future: finished, type: builtins.NoneType, key: a-a5eb50e9015acdf60b1094aa4e467e00>
>>> client.gather(client.submit(a))
>>> client.gather(client.submit(a))
>>>
有趣的是,python在执行该脚本时的输出并不稳定:

$ python test_dask2.py
d
b
c
a
b
a
a
$ python test_dask2.py
d
b
c
a
distributed.scheduler - CRITICAL - Tried writing to closed comm: {'op': 'lost-data', 'key': 'x-bff0c0d6e4239ae9c5beaed070018a1e'}
distributed.scheduler - CRITICAL - Tried writing to closed comm: {'op': 'lost-data', 'key': 'x-59dc11a9fc2db8a0885e47d3e5891304'}
$
有没有一种方法可以确保一个给定的任务,在给定的输入下,即使我多次提交,也只执行一次?如果我理解正确,那应该是正常的行为。如果对
print
的调用是防止这种情况发生的副作用,为什么不一致?例如,如何防止生成输出文件的任务被执行两次

还有,最后的错误是什么,并不总是发生

编辑:


我想我已经在第二个代码片段中弄明白了为什么我的一些任务被运行了几次:dask的
submit
分配给任务以进行标识的哈希值有时甚至在多次提交同一任务时(甚至在任务完成并超出范围之前)也会发生变化。在
submit
中将
参数设置为固定值(例如任务名称)可以解决该问题

简单的回答是:dask在内存中保存结果,而某些东西需要它。在这些情况下,“需要”可以是会话中的未来任务,也可以是取决于结果的另一项任务

在像
client.gather(client.submit(a))
这样的行中,由
submit
生成的未来在收集后立即被遗忘。在类似于
client.submit(a)
的行中,生成的未来存储在会话的“last result”变量
\uu
中,因此会被记住,集群不会清除它

如果需要更多控制,可以分配以下变量:

fut = client.submit(a)  # sets func running, keeps hold of the future
fut2 = client.submit(a)  # uses already existing task to get result
client.gather(fut), fut.result() # get results
del fut2, fut  #  "forget" futures, and have cluster release them

请记住使用仪表板查看集群的当前状态。

简短的回答是:dask会在内存中保留结果,而某些东西需要它。在这些情况下,“需要”可以是会话中的未来任务,也可以是取决于结果的另一项任务

在像
client.gather(client.submit(a))
这样的行中,由
submit
生成的未来在收集后立即被遗忘。在类似于
client.submit(a)
的行中,生成的未来存储在会话的“last result”变量
\uu
中,因此会被记住,集群不会清除它

如果需要更多控制,可以分配以下变量:

fut = client.submit(a)  # sets func running, keeps hold of the future
fut2 = client.submit(a)  # uses already existing task to get result
client.gather(fut), fut.result() # get results
del fut2, fut  #  "forget" futures, and have cluster release them

请记住使用仪表板查看群集的当前状态。

我想您正在查找以下文档页面

我想您正在查找以下文档页面