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.
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to