[pytango] 19/25: Update green mode bindings
Sandor Bodo-Merle
sbodomerle-guest at moszumanska.debian.org
Thu Sep 28 19:17:17 UTC 2017
This is an automated email from the git hooks/post-receive script.
sbodomerle-guest pushed a commit to tag v8.1.9
in repository pytango.
commit 124ff2fe1ba243cb91ebc2993ee4012f5afc6f8a
Author: Vincent Michel <vincent.michel at maxlab.lu.se>
Date: Tue Aug 9 11:36:50 2016 +0200
Update green mode bindings
---
src/boost/python/tango_asyncio.py | 110 ++++++++++++++++++++++++++++++++++++++
src/boost/python/tango_futures.py | 6 ++-
src/boost/python/tango_gevent.py | 5 +-
3 files changed, 119 insertions(+), 2 deletions(-)
diff --git a/src/boost/python/tango_asyncio.py b/src/boost/python/tango_asyncio.py
new file mode 100644
index 0000000..191eaac
--- /dev/null
+++ b/src/boost/python/tango_asyncio.py
@@ -0,0 +1,110 @@
+# -----------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# -----------------------------------------------------------------------------
+
+from __future__ import absolute_import
+
+__all__ = ["get_global_executor", "submit", "spawn", "wait", "get_event_loop"]
+
+__global_executor = None
+
+
+def __get_executor_class():
+ # Imports
+ import concurrent.futures
+ from functools import partial
+ try:
+ import asyncio
+ except ImportError:
+ import trollius as asyncio
+
+ # Asyncio executor
+ class AsyncioExecutor(concurrent.futures.Executor):
+ """Executor to submit task to a subexecutor through an asyncio loop.
+ Warning: This class has nothing to do with the AsyncioExecutor class
+ implemented for the server.
+ """
+
+ def __init__(self, loop=None, subexecutor=None):
+ self.subexecutor = subexecutor
+ self.loop = loop or asyncio.get_event_loop()
+
+ def submit(self, fn, *args, **kwargs):
+ callback = partial(fn, *args, **kwargs)
+ return self.loop.run_in_executor(self.subexecutor, callback)
+
+ # Return
+ return AsyncioExecutor
+
+
+def get_global_executor():
+ # Get global executor
+ global __global_executor
+ if __global_executor is not None:
+ return __global_executor
+ # Import futures executor
+ try:
+ from .tango_futures import get_global_executor as get_futures_executor
+ except ImportError:
+ get_futures_executor = lambda: None
+ # Set global
+ loop = get_event_loop()
+ klass = __get_executor_class()
+ subexecutor = get_futures_executor()
+ __global_executor = klass(loop, subexecutor)
+ return __global_executor
+
+
+def submit(fn, *args, **kwargs):
+ return get_global_executor().submit(fn, *args, **kwargs)
+
+spawn = submit
+
+
+def wait(fut, timeout=None, loop=None):
+ # Imports
+ try:
+ import asyncio
+ except ImportError:
+ import trollius as asyncio
+ # Run loop
+ loop = loop or asyncio.get_event_loop()
+ coro = asyncio.wait_for(fut, timeout, loop=loop)
+ return loop.run_until_complete(coro)
+
+
+def get_event_loop():
+ # Imports
+ try:
+ import asyncio
+ except ImportError:
+ import trollius as asyncio
+ # Get loop
+ global __event_loop
+ if __event_loop is not None:
+ return __event_loop
+ # Create loop
+ try:
+ loop = asyncio.get_event_loop()
+ except RuntimeError:
+ loop = asyncio.new_event_loop()
+ asyncio.set_event_loop(loop)
+
+ def submit(fn, *args, **kwargs):
+ callback = lambda: fn(*args, **kwargs)
+ return loop.call_soon_threadsafe(callback)
+
+ # Patch loop
+ loop.submit = submit
+ __event_loop = loop
+ return loop
+
+
+__event_loop = None
diff --git a/src/boost/python/tango_futures.py b/src/boost/python/tango_futures.py
index b0a8dc0..f75774b 100644
--- a/src/boost/python/tango_futures.py
+++ b/src/boost/python/tango_futures.py
@@ -9,7 +9,7 @@
# See LICENSE.txt for more info.
# ------------------------------------------------------------------------------
-__all__ = ["uses_future", "get_global_executor", "submit", "spawn"]
+__all__ = ["get_global_executor", "submit", "spawn", "wait"]
__global_executor = None
@@ -40,4 +40,8 @@ def submit(fn, *args, **kwargs):
return get_global_executor().submit(fn, *args, **kwargs)
+def wait(fut, timeout=None):
+ return fut.result(timeout=timeout)
+
+
spawn = submit
diff --git a/src/boost/python/tango_gevent.py b/src/boost/python/tango_gevent.py
index b10ff66..28246fc 100644
--- a/src/boost/python/tango_gevent.py
+++ b/src/boost/python/tango_gevent.py
@@ -14,7 +14,7 @@ import sys
import types
__all__ = ["get_global_threadpool", "get_global_executor",
- "get_event_loop", "submit", "spawn"]
+ "get_event_loop", "submit", "spawn", "wait"]
def get_global_threadpool():
import gevent
@@ -95,3 +95,6 @@ def get_event_loop():
__event_loop = gevent.spawn(loop, queue)
__event_loop.submit = submit
return __event_loop
+
+def wait(greenlet, timeout=None):
+ return greenlet.get(timeout=timeout)
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/pytango.git
More information about the debian-science-commits
mailing list