From a5e78cca819ccdd798c3bbe29163542ad8c595b2 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Nov 2014 15:16:57 +0100 Subject: [PATCH] initial commit --- .hgignore | 17 +++++++++++++++++ README | 13 +++++++++++++ aiogreen/__init__.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 .hgignore create mode 100644 README create mode 100644 aiogreen/__init__.py diff --git a/.hgignore b/.hgignore new file mode 100644 index 0000000..9414876 --- /dev/null +++ b/.hgignore @@ -0,0 +1,17 @@ +.*\.py[co]$ +.*~$ +.*\.orig$ +.*\#.*$ +.*@.*$ +\.coverage$ +htmlcov$ +\.DS_Store$ +venv$ +distribute_setup.py$ +distribute-\d+.\d+.\d+.tar.gz$ +build$ +dist$ +.*\.egg-info$ + +# Directory created by the "tox" command (ex: tox -e py27) +.tox diff --git a/README b/README new file mode 100644 index 0000000..9253fa5 --- /dev/null +++ b/README @@ -0,0 +1,13 @@ +asyncio event loop scheduling callbacks in eventlet. + +Implemented: + +* call_soon +* call_later +* call_at + +To do: + +* stop +* run_until_complete +* run_forever diff --git a/aiogreen/__init__.py b/aiogreen/__init__.py new file mode 100644 index 0000000..12a0499 --- /dev/null +++ b/aiogreen/__init__.py @@ -0,0 +1,43 @@ +import trollius +import eventlet + +class EventLoopPolicy(trollius.DefaultEventLoopPolicy): + pass + +class EventLoop(trollius.SelectorEventLoop): + def __init__(self, selector=None): + super(EventLoop, self).__init__(selector=selector) + self._pool = eventlet.GreenPool() + self._timers = [] + + def _call(self, handle): + if handle._cancelled: + return + handle._run() + + def call_soon(self, callback, *args): + handle = trollius.Handle(callback, args, self) + self._pool.spawn(self._call, handle) + return handle + + def _call_later(self, handle): + greenthread = eventlet.getcurrent() + self._timers.remove(greenthread) + self._call(handle) + + def call_later(self, delay, callback, *args): + # FIXME: cancelling the handle should unschedule the timer + handle = trollius.Handle(callback, args, self) + greenthread = eventlet.spawn_after(delay, self._call_later, handle) + self._timers.append(greenthread) + return handle + + def call_at(self, when, callback, *args): + delay = when - self.time() + return self.call_later(delay, callback, *args) + + def run_forever(self): + self._pool.waitall() + # FIXME: more efficient code :-) + while self._timers: + eventlet.sleep(0.1)