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

Ответы на вопрос(2)

Ваш ответ на вопрос