Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!feeder.erje.net!eu.feeder.erje.net!newsfeed.xs4all.nl!newsfeed4a.news.xs4all.nl!xs4all!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.000 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'context': 0.07; 'socket': 0.07; 'subject:Question': 0.07; 'tkinter': 0.07; 'callback': 0.09; 'happens.': 0.09; 'received:80.91': 0.09; 'received:80.91.229': 0.09; 'received:gmane.org': 0.09; 'received:list': 0.09; 'style.': 0.09; 'windows,': 0.09; 'wrapped': 0.09; 'def': 0.12; 'jan': 0.12; '(via': 0.16; '(without': 0.16; 'blocking': 0.16; 'clears': 0.16; 'devoid': 0.16; 'itself,': 0.16; 'loop.': 0.16; 'non-blocking': 0.16; 'operation),': 0.16; 'operation,': 0.16; 'operational': 0.16; 'received:80.91.229.3': 0.16; 'received:plane.gmane.org': 0.16; 'reedy': 0.16; 'subject:doc': 0.16; 'substitute': 0.16; 'true:': 0.16; 'wrote:': 0.18; 'bit': 0.19; 'meant': 0.20; 'seems': 0.21; '>>>': 0.22; 'code,': 0.22; 'input': 0.22; 'select': 0.22; 'example': 0.22; 'import': 0.22; 'coding': 0.22; 'header:User-Agent:1': 0.23; 'example.': 0.24; 'oriented': 0.24; 'question': 0.24; 'equivalent': 0.26; 'shown': 0.26; 'header:X -Complaints-To:1': 0.27; 'header:In-Reply-To:1': 0.27; 'function': 0.29; 'feature': 0.29; 'am,': 0.29; 'unix': 0.29; 'statement': 0.30; 'url:mailman': 0.30; 'included': 0.31; 'code': 0.31; 'getting': 0.31; 'run': 0.32; 'url:python': 0.33; "i'd": 0.34; 'something': 0.35; 'there': 0.35; 'really': 0.36; 'functions.': 0.36; 'i.e.': 0.36; 'yield': 0.36; 'url:listinfo': 0.36; 'shows': 0.36; 'hi,': 0.36; 'url:org': 0.36; 'should': 0.36; 'tasks': 0.38; 'url:library': 0.38; 'to:addr:python-list': 0.38; 'does': 0.39; 'received:71': 0.39; 'to:addr:python.org': 0.39; 'either': 0.39; 'received:org': 0.40; 'url:mail': 0.40; 'how': 0.40; 'even': 0.60; 'skip:u 10': 0.60; 'url:3': 0.61; 'real': 0.63; 'july': 0.63; 'dont': 0.67; 'believe': 0.68; 'fact,': 0.69; 'behavior': 0.77; 'examples.': 0.84; 'formulated': 0.84; 'received:fios.verizon.net': 0.84; 'streams': 0.84; 'hand,': 0.93 X-Injected-Via-Gmane: http://gmane.org/ To: python-list@python.org From: Terry Reedy Subject: Re: Question about asyncio doc example Date: Thu, 24 Jul 2014 02:58:53 -0400 References: Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Gmane-NNTP-Posting-Host: pool-71-175-90-87.phlapa.fios.verizon.net User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 In-Reply-To: X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 89 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1406185154 news.xs4all.nl 2851 [2001:888:2000:d::a6]:58991 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:75128 On 7/24/2014 1:15 AM, Saimadhav Heblikar wrote: > On 24 July 2014 05:54, Terry Reedy 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