Я хочу добавить обратный вызов в будущее после его завершения.
Согласно документации:
Обратный вызов в будущем, когда обратный вызов завершится.
Обратный вызов fn должен принимать будущее как единственный аргумент. Это будет вызвано независимо от того, завершится ли будущее успешно, ошибочно или отменено.
Обратный вызов выполняется в отдельном потоке.
Это не дает мне того, что мне нужно, из-за требования обратного вызова fn, чтобы принимать в качестве единственного аргумента будущее.
Вот пример кода части того, что я пытаюсь сделать:
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_queue в клиент:
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)
Вещи работают, как ожидалось, вот так. Но я предпочитаю иметь возможность делать это извне Что я упустил или не вижу, чтобы сделать эту работу?
Спасибо