I am new to the asyncio subject, just trying to figure out how to use it. Below 
is the script I use for testing:
---------------------------------
# asyncio_cancel_task2.py

import asyncio

@asyncio.coroutine
def task_func():
    print('in task_func, sleeping')
    try:
        yield from asyncio.sleep(1)
    except asyncio.CancelledError:
        print('task_func was canceled')
        raise
    print('return result')
    return 'the result'

def task_canceller(task):
    task.cancel()
    print('canceled the task')

@asyncio.coroutine
def main(loop):
    print('first, scheduling a task')
    task = loop.create_task(task_func())
    print('second, scheduling its cancellation')
    loop.call_later(0.5, task_canceller, task)
    try:
        print('waiting task to complete')
        yield from task
    except asyncio.CancelledError:
        print('main() also sees task as canceled')


event_loop = asyncio.get_event_loop()
try:
    event_loop.run_until_complete(main(event_loop))
finally:
    print('wait 3 seconds before closing event_loop')
    asyncio.sleep(3)
    print('event_loop was closed')
    event_loop.close()
-----------------------------------

It schedules two tasks, the task_func and the task_canceller, in main. Before 
the task_func completed, the task_canceller was fired to cancel it. Hence its 
output below seems reasonable.

D:\Works\Python>py
Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 19:28:18) [MSC v.1600 32 bit 
(Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio_cancel_task2
first, scheduling a task
second, scheduling its cancellation
waiting task to complete
in task_func, sleeping
canceled the task
task_func was canceled
main() also sees task as canceled
wait 3 seconds before closing event_loop
event_loop was closed
>>>

Then, I changed the call_later delay from 0.5 to 1.5, expect it to be called 
after the task_func completed and before the event loop closed. The output 
seems not quite right. Why the task_canceller hasn't been called?

>>> import asyncio_cancel_task2
first, scheduling a task
second, scheduling its cancellation
waiting task to complete
in task_func, sleeping
return result
wait 3 seconds before closing event_loop
event_loop was closed
>>>

Best Regards,
Jach Fong

-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to