我想提交一个执行以下操作的dask任务:
def fakejob
)我需要为多个输入执行此操作,因此我一直在尝试使用dask.distributed的期货功能。
from dask.distributed import Client
client = Client(processes=True)
def fakejob(path):
return (
dask.bag
.read_text(path)
.to_dataframe()
)
futures = client.map(fakejob, [input_path1, input_path2])
我遇到的问题是:AssertionError: daemonic processes are not allowed to have children
我尝试过关注this link并最终获得了第二个版本(与第一个版本相差1行),但期货永远保持“待定”状态。
from dask.distributed import Client
client = Client(processes=True)
def fakejob(path):
with dask.set_options(get=client.get):
return (
dask.bag
.read_text(path)
.to_dataframe()
)
futures = client.map(fakejob, [input_path1, input_path2])
有关如何执行此操作的任何线索?
干杯。
答案 0 :(得分:2)
在工作进程中尝试构造dask图(这就是一个包),这是一个奇怪的,稍微有点笨拙的错误消息,如果用client.map调用,那么事情就会结束。如果您可以将整个工作流程放在函数中,包括写入镶木地板,并且没有尝试将包传回给调用者,那么您的第二次尝试将与本地客户端一起使用。
解决方案更简单。
bags = [dask.bag.read_text(path)
.to_dataframe() for path in [input_path1, input_path2])
futures = client.compute(bags) # run in background on the cluster
client.gather(futures) # wait and get results
这里,bags
是一个dask-bag列表,即已定义但尚未运行的工作任务。您可以使用dask.compute(*bags)
替换最后两行以获得结果而不必担心未来。