[Bf-blender-cvs] [f4f6e6f] asset-engine: AmberAIO: Fix asyncio loop handling.

Bastien Montagne noreply at git.blender.org
Tue Sep 6 14:44:03 CEST 2016


Commit: f4f6e6f525f39922f7982b27c404d3dc974e8987
Author: Bastien Montagne
Date:   Tue Sep 6 14:12:08 2016 +0200
Branches: asset-engine
https://developer.blender.org/rBf4f6e6f525f39922f7982b27c404d3dc974e8987

AmberAIO: Fix asyncio loop handling.

Finally found the right way to do this (at least, I think! :P).

===================================================================

M	release/scripts/startup/bl_operators/amber_asyncio.py

===================================================================

diff --git a/release/scripts/startup/bl_operators/amber_asyncio.py b/release/scripts/startup/bl_operators/amber_asyncio.py
index 14fdb38..d4821db 100644
--- a/release/scripts/startup/bl_operators/amber_asyncio.py
+++ b/release/scripts/startup/bl_operators/amber_asyncio.py
@@ -148,13 +148,17 @@ class AmberJob:
 
     @staticmethod
     def async_looper(func):
+        """Defines a simple wrapper around the function that executes it before stepping a bit asyncio loop."""
         def wrapper(*args, **kwargs):
             loop = asyncio.get_event_loop()
-            print("kickstop")
-            loop.stop()
             print("proceed....")
             func(*args, **kwargs)
-            print("kickstart")
+            print("kickstep")
+            # That's the trick - since asyncio loop is not the main loop, we cannot call run_forever, or we would
+            # never get back our thread (not until something in asyncio loop itself calls stop(), at least).
+            # So we schedule ourselves the stop call, effectively leading to 'stepping' asyncio loop.
+            # This relies on the fact that main loop (aka Blender) calls an @AmberJob.async_looper func often enough!
+            loop.call_soon(loop.stop)
             loop.run_forever()
         return wrapper




More information about the Bf-blender-cvs mailing list