[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