Асинхронная обработка Dask, печать результатов по мере их поступления

1

Следующий пример не работает, если asynchronous ключевое слово не используется в Localcluster. Я хотел бы контролировать, сколько процессов/работников используется и обрабатывать функции параллельно, и распечатывать результаты по мере их готовности. Что нужно изменить?

import time
from dask.distributed import Client, LocalCluster, as_completed


def wait(sec):
    time.sleep(sec)
    return sec


def main():

    cluster = LocalCluster(n_workers=2, ncores=2, asynchronous=True)
    inputs = [5, 7, 3, 1]
    client = Client(cluster)
    futures = client.map(wait, inputs)

    for future, result in as_completed(futures, with_results=True):
        print(result)

    client.close()


if __name__ == '__main__':
    main()
Теги:
dask
asynchronous
cluster-computing

1 ответ

1
Лучший ответ

Как вы полагаете, вы должны удалить asynchronous= ключевое слово из вашего вызова LocalCluster. Это ключевое слово используется для поддержки асинхронных функций, например:

async def main():
    cluster = await LocalCluster(n_workers=2, ncores=2, asynchronous=True)
    inputs = [5, 7, 3, 1]
    client = await Client(cluster, asynchronous=True)
    futures = client.map(wait, inputs)

    async for future, result in as_completed(futures, with_results=True):
        print(result)

    await client.close()

Если вы не хотите использовать синтаксис асинхронного ожидания (что относительно редко), вы должны игнорировать асинхронное ключевое слово. Вероятно, это не так, как вы думаете.

  • 0
    Спасибо! Я могу вызвать функцию с помощью get_event_loop().run_until_complete(main()) и код заканчивается TimeoutError?
  • 0
    Я также удивлен, что результат составляет 1, 3, 5, 7, потому что я думал, что работа двух рабочих даст 5, 7, 3, 1? Как осуществляется раздача работникам?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню