| 
					
				 | 
			
			
				@@ -20,38 +20,57 @@ cdef bint _grpc_aio_initialized = False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 # a single event loop picked by "init_grpc_aio". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 cdef object _grpc_aio_loop 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 cdef object _event_loop_thread_ident 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cdef str _GRPC_ASYNCIO_ENGINE = os.environ.get('GRPC_ASYNCIO_ENGINE', 'default').lower() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+grpc_aio_engine = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class AsyncIOEngine(enum.Enum): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    DEFAULT = 'default' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    CUSTOM_IO_MANAGER = 'custom' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    CQ_POLLER = 'poller' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def init_grpc_aio(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     global _grpc_aio_initialized 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     global _grpc_aio_loop 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     global _event_loop_thread_ident 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    global grpc_aio_engine 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # Marks this function as called 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if _grpc_aio_initialized: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         _grpc_aio_initialized = True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        _event_loop_thread_ident = threading.current_thread().ident 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # Picks the engine for gRPC AsyncIO Stack 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for engine_type in AsyncIOEngine: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if engine_type.value == _GRPC_ASYNCIO_ENGINE: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            grpc_aio_engine = engine_type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if grpc_aio_engine is None or grpc_aio_engine is AsyncIOEngine.DEFAULT: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        grpc_aio_engine = AsyncIOEngine.CUSTOM_IO_MANAGER 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     # Anchors the event loop that the gRPC library going to use. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     _grpc_aio_loop = asyncio.get_event_loop() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    # Activates asyncio IO manager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    # install_asyncio_iomgr() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _event_loop_thread_ident = threading.current_thread().ident 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     # TODO(https://github.com/grpc/grpc/issues/22244) we need a the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     # grpc_shutdown_blocking() counterpart for this call. Otherwise, the gRPC 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     # library won't shutdown cleanly. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     grpc_init() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    # Timers are triggered by the Asyncio loop. We disable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    # the background thread that is being used by the native 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    # gRPC iomgr. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    # grpc_timer_manager_set_threading(False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if grpc_aio_engine is AsyncIOEngine.CUSTOM_IO_MANAGER: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # Activates asyncio IO manager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        install_asyncio_iomgr() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # Timers are triggered by the Asyncio loop. We disable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # the background thread that is being used by the native 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # gRPC iomgr. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        grpc_timer_manager_set_threading(False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    # gRPC callbaks are executed within the same thread used by the Asyncio 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    # event loop, as it is being done by the other Asyncio callbacks. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    # Executor.SetThreadingAll(False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # gRPC callbaks are executed within the same thread used by the Asyncio 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # event loop, as it is being done by the other Asyncio callbacks. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Executor.SetThreadingAll(False) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     _grpc_aio_initialized = False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |