如何在每位工作人员上延迟延迟的队列,以允许顺序执行流程?

时间:2019-04-12 06:18:27

标签: dask dask-distributed dask-delayed

我需要工作人员一次处理一个任务,并在开始新任务之前完成当前过程。我无法做到:(1)随时在每个工作人员上最多运行一项任务,(2)使工作人员在开始新任务之前先完成一个过程;原子交易。

我在40个节点的群集上使用dask.distributed Client; 4个内核和15GB内存。我处理的管道具有大约8-10GB的任务,因此在一项工作中有两个任务将导致应用程序失败。

我尝试用dask-worker scheduler-ip:port --nprocs 1 --resources process=1futures = [client.submit(func, f, resources={'process': 1}) for f in futures]分配工人资源和任务分配,但是没有成功。

我的代码如下:

import dask
from dask.distributed import Client


@dask.delayed
def load():
  ...


@dask.delayed
def foo():
  ...


@dask.delayed
def save():
  ...

client = Client(scheduler-ip:port)

# Process file from a given path
paths = ['list', 'of', 'path']

results = []
for path in paths:
  img = load(path)

  for _ in range(n):
    img = foo(img)

  results.append(save(output-filename))

client.scatter(results)
futures = client.compute(results)

def identity(x):
  return x
client.scatter(futures)
futures = [client.submit(same, f, resources={'process': 1}) for f in futures]

client.gather(futures)

截至目前,我有两种情况:

1-我运行了所有输入,应用程序以MemoryError终止

2-我运行了一个子样本,但是其运行如下:

加载(img-1)->加载(img-2)-> foo(img-1)->加载(img-3)-> ...->保存(img-1)->保存( img-2)-> ...

TLDR:这是我要对每个工作人员执行的操作:

加载(img-1)-> foo(img-1)->保存(img-1)->加载(img-7)-> ...

1 个答案:

答案 0 :(得分:0)

这里最简单的事情可能就是只用一个线程启动您的工作程序

dask-worker ... --nthreads 1

然后那个工人一次只会开始一件事