asyncio: возможно ли отменить будущее, выполненное Исполнителем?
Я хотел бы запустить блокирующую функцию в Executor с помощью вызова asyncio loop.run_in_executor, а затем отменить ее позже, но, похоже, это не работает для меня.
Вот код:
import asyncio
import time
from concurrent.futures import ThreadPoolExecutor
def blocking_func(seconds_to_block):
for i in range(seconds_to_block):
print('blocking {}/{}'.format(i, seconds_to_block))
time.sleep(1)
print('done blocking {}'.format(seconds_to_block))
@asyncio.coroutine
def non_blocking_func(seconds):
for i in range(seconds):
print('yielding {}/{}'.format(i, seconds))
yield from asyncio.sleep(1)
print('done non blocking {}'.format(seconds))
@asyncio.coroutine
def main():
non_blocking_futures = [non_blocking_func(x) for x in range(1, 4)]
blocking_future = loop.run_in_executor(None, blocking_func, 5)
print('wait a few seconds!')
yield from asyncio.sleep(1.5)
blocking_future.cancel()
yield from asyncio.wait(non_blocking_futures)
loop = asyncio.get_event_loop()
executor = ThreadPoolExecutor(max_workers=1)
loop.set_default_executor(executor)
asyncio.async(main())
loop.run_forever()
Я ожидаю, что приведенный выше код позволит только выводить функцию блокировки:
blocking 0/5
blocking 1/5
а затем посмотреть вывод неблокирующей функции. Но вместо этого будущее блокирования продолжается даже после того, как я отменил.
Является ли это возможным? Есть ли другой способ сделать это?
Спасибо
Редактировать: Подробнее о запуске блокирующего и неблокирующего кода с помощью asyncio:Как связать блокирующий и неблокирующий код с asyncio