Strange AssertionError in asyncio
python, python-3.x, python-asyncio
Solution
What causes the exception: `greet` continues to run even after the `future.set_result` call; By changing`while True` with `if True`, you will get what I mean.
How about using `asyncio.Event`?
import asyncio
@asyncio.coroutine
def greet(stop):
while not stop.is_set():
print('Hello World')
yield from asyncio.sleep(1)
@asyncio.coroutine
def main():
stop = asyncio.Event()
loop.call_later(3, stop.set)
yield from asyncio.async(greet(stop))
print('Ready')
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Problem
I'm trying to mark future done by timeout with this code: ``` import asyncio @asyncio.coroutine def greet(): while True: print('Hello World') yield from asyncio.sleep(1) @asyncio.coroutine def main(): future = asyncio.async(greet()) loop.call_later(3, lambda: future.set_result(True)) yield from future print('Ready') loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` "Timer" loop.call_later sets result to future after 3 seconds. It works, but I'm getting exception too: ``` Hello World Hello World Hello World Ready Exception in callback <bound method Task._wakeup of Task(<greet>)<result=True>>(Future<result=None>,) handle: Handle(<bound method Task._wakeup of Task(<greet>)<result=True>>, (Future<result=None>,)) Traceback (most recent call last): File "C:\Python33\lib\site-packages\asyncio\events.py", line 39, in _run self._callback(*self._args) File "C:\Python33\lib\site-packages\asyncio\tasks.py", line 337, in _wakeup self._step(value, None) File "C:\Python33\lib\site-packages\asyncio\tasks.py", line 267, in _step '_step(): already done: {!r}, {!r}, {!r}'.format(self, value, exc) AssertionError: _step(): already done: Task(<greet>)<result=True>, None, None ``` What can mean this AssertionError? Am I doing something wrong setting future done by loop.call_later?