Question about asyncio doc example
Terry Reedy
tjreedy at udel.edu
Thu Jul 24 02:58:53 EDT 2014
On 7/24/2014 1:15 AM, Saimadhav Heblikar wrote:
> On 24 July 2014 05:54, Terry Reedy <tjreedy at udel.edu> wrote:
>> On 7/23/2014 6:43 AM, Saimadhav Heblikar wrote:
>>>
>>> Hi,
>>>
>>> The example in question is
>>>
>>> https://docs.python.org/3/library/asyncio-task.html#example-hello-world-coroutine.
>>> I'd like to learn the purpose of the statement
>>> "yield from asyncio.sleep(2)" in that example.
>>>
>>> In particular, I'd like to know if asyncio.sleep() is used as a
>>> substitute for slow/time consuming operation, i.e. in real code,
>>> whether there will be a real time consuming statement in place of
>>> asyncio.sleep().
>>
>>
>> The context is
>> while True:
>> print('Hello')
>> yield from asyncio.sleep(3)
>>
>> sleep is both itself, to shown to schedule something at intervals in a
>> non-blocking fashion, as well as a placefiller. The blocking equivalent
>> would use 'time' instead of 'yield from asyncio'. The following shows the
>> non-blocking feature a bit better.
>>
>> import asyncio
>>
>> @asyncio.coroutine
>> def hello():
>> while True:
>> print('Hello')
>> yield from asyncio.sleep(3)
>>
>> @asyncio.coroutine
>> def goodbye():
>> while True:
>> print('Goodbye')
>> yield from asyncio.sleep(5.01)
>>
>> @asyncio.coroutine
>> def world():
>> while True:
>> print('World')
>> yield from asyncio.sleep(2.02)
>>
>> loop = asyncio.get_event_loop()
>> loop.run_until_complete(asyncio.wait([hello(), goodbye(), world()]))
>>
>> Getting the same time behavior in a while...sleep loop requires reproducing
>> some of the calculation and queue manipulation included in the event loop.
>>
>> --
>> Terry Jan Reedy
>>
>> --
>> https://mail.python.org/mailman/listinfo/python-list
>
> That clears it up for me. For situations where I dont really know how
> long a function is going to take(say waiting for user input or a
> network operation), I am better off using callbacks than "yield from
> asyncio.sleep()". Is my understanding correct?
The question is not formulated very well. In asyncio parlance, 'using
callbacks' contrasts with 'using co-routines'. It is a coding-style
contrast. Tkinter only has the callback style.
On the other hand, waiting (via sleep, without blocking other tasks) for
a definite time interval contrasts with waiting (without blocking other
tasks) until an event happens. This is an operational contrast. Tkinter
has both possibilities, using call_after versus event-handler
registration. I believe asyncio can do either type of waiting with
either coding style.
18.5.3. Tasks and coroutines, seems to be devoid of event wait examples.
However, there is a 'yield from' network example in 18.5.5 Streams using
socket functions wrapped with coroutines. These should definitely be
used instead of sleep. In fact, for cross-platform network code meant to
run on *nix and Windows, they are better than the unix oriented select
and poll functions.
I believe asyncio does not do key events, even though that is a form of
unpredictable input.
--
Terry Jan Reedy
More information about the Python-list
mailing list