2015-06-01 8 views
3

Это может показаться немного странным, но возможно ли, что Tornado завершит выполнение будущего после его обертывания в таймаут?Результат будущего Tornado после таймаута

Так что-то вроде этого:

try: 
    result = yield gen.with_timeout(time.time() + 1, future) 
except gen.TimeoutError as e: 
    print('Timed out!') 

Таким образом, в этом случае, future не завершена до тайм-аута, но я хочу продолжить выполнение независимо вызываемая он имеет.

Выражаясь иначе, я хочу, чтобы иметь возможность использовать это наряду с gen.WaitIterator, чтобы получить результаты набора фьючерсов, как описано в документе:

Если вам нужно, чтобы получить результат каждого будущего как можно скорее, или если вам нужен результат некоторых фьючерсов, даже если другие производят ошибки, вы можете использовать WaitIterator.

Это именно то, что я ищу, я хочу получить результат каждого будущего как можно скорее, потому что у меня есть некоторые задачи, которые занимают больше времени, чем другие, но за одним исключением: эти медленные задачи должны продолжать производить результаты, чтобы я мог получить доступ их позже.

Возможно ли это?

ответ

2

with_timeout не отменяет основной Future, поэтому он может быть использован повторно:

future = do_something_async() 
while True: 
    try: 
     result = yield gen.with_timeout(timedelta(seconds=1), future) 
     break 
    except gen.TimeoutError: 
     print('tick') 

В сочетании с WaitIterator немного сложнее, так как вы не должны вызывать WaitIterator.next снова, пока предыдущая не завершится.

Также рассмотрите классы Queue, представленные в Tornado 4.2. Они часто могут создавать более чистый код, чем WaitIterator (и они имеют встроенную поддержку тайм-аута вместо обёртки with_timeout).

+0

Я думаю, что я могу использовать класс «Queue» для агрегирования результатов из разных веб-сервисов ... Обычно я хочу получать результаты от различных веб-сервисов (некоторые медленные, некоторые быстрее) и ждать всех результатов для конкретное время. Должен ли я искать пример очереди (веб-паук) в документах? Кроме того, можно ли вместо этого использовать 'concurrent.futures.ThreadPoolExecutor'? (так как он также имеет ['concurrent.futures.wait'] (https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.wait)) –

+0

Да, демо-версия веб-сканера - это лучший пример использования очереди. Просто поместите результат каждой выборки в очередь и зачитайте их в «основной» задаче. Вы не можете использовать AsyncHTTPClient с ThreadPoolExecutor (вы могли бы использовать синхронный HTTP-клиент, но это было бы дороже, чем безпоточный). –