Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.python > #60319 > unrolled thread
| Started by | "Tobias M." <tm@tobix.eu> |
|---|---|
| First post | 2013-11-23 21:30 +0100 |
| Last post | 2013-11-23 21:30 +0100 |
| Articles | 1 — 1 participant |
Back to article view | Back to comp.lang.python
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: Periodic execution with asyncio "Tobias M." <tm@tobix.eu> - 2013-11-23 21:30 +0100
| From | "Tobias M." <tm@tobix.eu> |
|---|---|
| Date | 2013-11-23 21:30 +0100 |
| Subject | Re: Periodic execution with asyncio |
| Message-ID | <mailman.3098.1385238638.18130.python-list@python.org> |
Thanks a lot for your helpful posts, Terry!
On 11/23/2013 01:00 AM, Terry Reedy wrote:
> * Make the task function a parameter 'func'.
I actually like subclassing, but yes I know there are some downsides :)
>
> * Rename start to _set to better describe what is does and call it in
> the _run function to not repeat the handler setting line. (If 'start'
> has any magic meaning, I am not aware of it. I am aware that there
> could be situations in which one would want a public method, to be
> called from other handlers. But that would be a different class ;-)
>
> * Comment out the stop method because it is useless in the current
> usage. I believe handler.cancel is only relevant after the handler is
> set and before it is fired. This can only be done from another handler.
You are right, the handler setting line should not be repeated.
I choose start() and stop() for controlling the task because this is an
interface I would instantly understand as a user of this class.
By the way: My whole motivation is, that I want to implement such a task
class in a network library I am currently writing.
On 11/23/2013 02:33 AM, Terry Reedy wrote:
> I was initially baffled also until I managed to assemble all the
> needed pieces.
>
> import asyncio
>
> def f():
> print('Hello World')
>
> @asyncio.coroutine
> def g(func, interval):
> while True:
> yield from asyncio.sleep(interval)
> func()
>
> loop = asyncio.get_event_loop()
>
> try:
> loop.run_until_complete(asyncio.Task(g(f, 2)))
> except KeyboardInterrupt:
> print('Loop stopped')
>
Thanks, now I got it. I just couldn't figure out that I have to yield
from the sleep function.
Now putting this into a PeriodicTask class that provides a similar
interface like our callback version, I get:
import asyncio
class PeriodicTask2(object):
def __init__(self, func, interval):
self.func = func
self.interval = interval
self._loop = asyncio.get_event_loop()
def start(self):
self.loop.run_until_complete(asyncio.Task(self._run()))
@asyncio.coroutine
def _run(self):
while True:
yield from asyncio.sleep(self.interval)
self.func()
I don't know if I misunderstood anything, but as a user of this class I
am not able to run two task simultaneously because start() will block.
In the callback version I could instanciate two PeriodicTasks and run
them both at the same time (after a call to loop.run_forever()), which
is actually what I wanted to achieve with this class.
Back to top | Article view | comp.lang.python
csiph-web