Python Dask add_done_回调其他参数?

Python Dask add_done_回调其他参数?,python,distributed-computing,dask,Python,Distributed Computing,Dask,我正在寻找一个回调添加到未来一旦它完成 根据文件: 回调完成后,在future上调用回调 回调fn应该将未来作为其唯一的参数。无论将来是否成功完成、出错或取消,都将调用此函数 回调在单独的线程中执行 这并没有提供我所需要的,因为回调fn需要将future作为它唯一的参数 下面是我将要做的工作的示例部分代码: def method(cu_device_id): print("Hello world, I'm going to use GPU %i" % cu_device_id) def

我正在寻找一个回调添加到未来一旦它完成

根据文件:

回调完成后,在future上调用回调

回调fn应该将未来作为其唯一的参数。无论将来是否成功完成、出错或取消,都将调用此函数

回调在单独的线程中执行

这并没有提供我所需要的,因为回调fn需要将future作为它唯一的参数

下面是我将要做的工作的示例部分代码:

def method(cu_device_id):
    print("Hello world, I'm going to use GPU %i" % cu_device_id)

def callback_fn(cu_device_id)
    gpu_queue.put(cu_device_id)

cu_device_id = gpu_queue.get()
future = client.submit(method, cu_device_id)
#gpu_queue.put(cu_device_id) # Does not work, clients will shortly end up piled onto the slowest GPU
result.add_done_callback(callback_fn) # Crash / no way to pass in cu_device_id
这里的想法是让一个客户机从队列中获取一个可用的GPU,然后在它使用完之后,将它放回队列中,以便另一个客户机可以使用它

解决此问题的一种方法是将gpu_队列传递到客户端:

def method(gpu_queue):
    cu_device_id = gpu_queue.get()
    print("Hello world, I'm going to use GPU %i" % cu_device_id)
    gpu_queue.put(cu_device_id)

future = client.submit(method, gpu_queue)
事情按预期的那样发展但我更愿意从外部做这件事我错过了什么或没有看到什么使这件事成功


谢谢

您也可以考虑在客户端使用一个<代码> ASyRead < /Cal>迭代器< /P>处理这个问题。
data = iter(data)
futures = []
using_gpu = {}

for i in range(n_gpus):
    future = client.submit(process, next(data), use_gpu=i)
    using_gpu[future] = i

seq = as_completed(futures)
for future in seq:
    gpu = using_gpu.pop(future)
    new = client.submit(process, next(data), use_gpu=gpu)  # TODO: handle end of data sequence gracefully
    using_gpu[new] = gpu
    seq.add(new)  # add this into the sequence