Индивидуальные тайм-ауты для concurrent.futures

Я вижу два способа указать время ожидания в concurrent.futures.

  • as_completed()
  • wait()

Оба метода обрабатывают N запущенных фьючерсов.

Я хотел бы указать индивидуальный тайм-аут для каждого будущего.

Вариант использования:

  • Future для получения данных из БД имеет тайм-аут 0,5 секунды.
  • Future для получения данных с HTTP-сервера имеет тайм-аут 1,2 секунды.

Как мне справиться с этим с concurrent.futures? Или эта библиотека не тот инструмент?

Вывод

  • Насколько мне известно, решение mdurant — хороший обходной путь.
  • Я думаю, что в следующий раз я буду использовать другую библиотеку. Возможно, у asyncio есть лучшая поддержка для этого. См.: https://docs.python.org/3/library/asyncio-task.html#asyncio.sleep

person guettli    schedule 19.07.2016    source источник


Ответы (1)


Как насчет реализации собственного:

wait(dbfutures + httpfutures, timeout=0.5)
[fut.cancel() for fut in bdfutures if not fut.done()]
wait(httpfutures, timeout=0.7)
[fut.cancel() for fut in httpfutures if not fut.done()]

(или цикл while со сном/проверкой или ожиданием с коротким тайм-аутом)

person mdurant    schedule 25.07.2016
comment
Да, я думаю, это единственное решение. Не красиво, но рабочий обходной путь. Я думаю, что в следующий раз я буду использовать асинхронный ввод-вывод: docs.python .org/3/library/asyncio-task.html#asyncio.sleep - person guettli; 29.07.2016