4747class AsyncClientAdapter :
4848
4949 def __init__ (self ,
50- loop : AbstractEventLoop ,
5150 connect_req : CreateConnectionRequest ,
51+ loop : Optional [AbstractEventLoop ] = None ,
5252 loop_validator : Optional [Callable [[Optional [AbstractEventLoop ]], AbstractEventLoop ]] = None
5353 ) -> None :
5454 num_io_threads = connect_req .options .get ('num_io_threads' , None )
5555 self ._connection = pycbc_connection (num_io_threads ) if num_io_threads is not None else pycbc_connection ()
56- if loop_validator :
57- self . _loop = loop_validator ( loop )
58- else :
59- self ._loop = self . _get_loop ( loop )
56+ # The loop will be setup prior to running the first async op.
57+ # This is the preferred mechanism to handling the event loop.
58+ self . _loop : Optional [ AbstractEventLoop ] = loop
59+ self ._loop_validator = loop_validator
6060 self ._connect_req = connect_req
6161 self ._binding_map = BindingMap (self ._connection )
6262 self ._close_ft : Optional [Future [None ]] = None
@@ -78,6 +78,8 @@ def connect_ft(self) -> Optional[Future[None]]:
7878
7979 @property
8080 def loop (self ) -> AbstractEventLoop :
81+ if not self ._loop :
82+ self ._loop = self ._get_loop ()
8183 return self ._loop
8284
8385 def _ensure_not_closed (self ) -> None :
@@ -101,14 +103,14 @@ def execute_bucket_request(self, req: BucketRequest) -> Future[Any]:
101103 self ._ensure_not_closed ()
102104 self ._ensure_connected ()
103105
104- ft = self ._loop .create_future ()
106+ ft = self .loop .create_future ()
105107
106108 def _callback (result ) -> None :
107- self ._loop .call_soon_threadsafe (ft .set_result , result )
109+ self .loop .call_soon_threadsafe (ft .set_result , result )
108110
109111 def _errback (exc ) -> None :
110112 excptn = ErrorMapper .build_exception (exc )
111- self ._loop .call_soon_threadsafe (ft .set_exception , excptn )
113+ self .loop .call_soon_threadsafe (ft .set_exception , excptn )
112114
113115 req_dict = req .req_to_dict (callback = _callback , errback = _errback )
114116 self ._execute_req (ft , req .op_name , req_dict )
@@ -121,14 +123,14 @@ def execute_close_bucket_request(self, bucket_name: str) -> Future[None]:
121123 def execute_cluster_request (self , req : ClusterRequest ) -> Future [Any ]:
122124 self ._ensure_not_closed ()
123125
124- ft = self ._loop .create_future ()
126+ ft = self .loop .create_future ()
125127
126128 def _callback (result ) -> None :
127- self ._loop .call_soon_threadsafe (ft .set_result , result )
129+ self .loop .call_soon_threadsafe (ft .set_result , result )
128130
129131 def _errback (exc ) -> None :
130132 excptn = ErrorMapper .build_exception (exc )
131- self ._loop .call_soon_threadsafe (ft .set_exception , excptn )
133+ self .loop .call_soon_threadsafe (ft .set_exception , excptn )
132134
133135 req_dict = req .req_to_dict (callback = _callback , errback = _errback )
134136 if not self .connected :
@@ -150,14 +152,14 @@ def execute_collection_request(self, req: CollectionRequest) -> Future[Any]:
150152 self ._ensure_not_closed ()
151153 self ._ensure_connected ()
152154
153- ft = self ._loop .create_future ()
155+ ft = self .loop .create_future ()
154156
155157 def _callback (result ) -> None :
156- self ._loop .call_soon_threadsafe (ft .set_result , result )
158+ self .loop .call_soon_threadsafe (ft .set_result , result )
157159
158160 def _errback (exc ) -> None :
159161 excptn = ErrorMapper .build_exception (exc )
160- self ._loop .call_soon_threadsafe (ft .set_exception , excptn )
162+ self .loop .call_soon_threadsafe (ft .set_exception , excptn )
161163
162164 req_dict = req .req_to_dict (callback = _callback , errback = _errback )
163165 self ._execute_req (ft , req .op_name , req_dict )
@@ -167,16 +169,16 @@ def execute_connect_bucket_request(self, bucket_name: str) -> Future[None]:
167169 self ._ensure_not_closed ()
168170
169171 req = OpenBucketRequest (bucket_name )
170- ft = self ._loop .create_future ()
172+ ft = self .loop .create_future ()
171173
172174 def _callback (_ ) -> None :
173175 if not ft .done ():
174- self ._loop .call_soon_threadsafe (ft .set_result , None )
176+ self .loop .call_soon_threadsafe (ft .set_result , None )
175177
176178 def _errback (ret : Any ) -> None :
177179 excptn = ErrorMapper .build_exception (ret )
178180 if not ft .done ():
179- self ._loop .call_soon_threadsafe (ft .set_exception , excptn )
181+ self .loop .call_soon_threadsafe (ft .set_exception , excptn )
180182
181183 req_dict = req .req_to_dict (callback = _callback , errback = _errback )
182184 if not self .connected :
@@ -189,16 +191,16 @@ def _errback(ret: Any) -> None:
189191 def execute_mgmt_request (self , req : MgmtRequest ) -> Future [Any ]:
190192 self ._ensure_not_closed ()
191193
192- ft = self ._loop .create_future ()
194+ ft = self .loop .create_future ()
193195
194196 def _callback (ret : Any ) -> None :
195197 if not ft .done ():
196- self ._loop .call_soon_threadsafe (ft .set_result , ret )
198+ self .loop .call_soon_threadsafe (ft .set_result , ret )
197199
198200 def _errback (ret : Any ) -> None :
199201 excptn = ErrorMapper .build_exception (ret , mapping = req .error_map )
200202 if not ft .done ():
201- self ._loop .call_soon_threadsafe (ft .set_exception , excptn )
203+ self .loop .call_soon_threadsafe (ft .set_exception , excptn )
202204
203205 req_dict = req .req_to_dict (callback = _callback , errback = _errback )
204206 if not self .connected :
@@ -244,17 +246,17 @@ def _execute_chained_req(self,
244246
245247 def _execute_close_connection_request (self ) -> Future [None ]:
246248 req = CloseConnectionRequest ()
247- ft = self ._loop .create_future ()
249+ ft = self .loop .create_future ()
248250
249251 def _callback (_ ) -> None :
250252 if not ft .done ():
251253 self ._reset_connection ()
252- self ._loop .call_soon_threadsafe (ft .set_result , None )
254+ self .loop .call_soon_threadsafe (ft .set_result , None )
253255
254256 def _errback (ret : Any ) -> None :
255257 excptn = ErrorMapper .build_exception (ret )
256258 if not ft .done ():
257- self ._loop .call_soon_threadsafe (ft .set_exception , excptn )
259+ self .loop .call_soon_threadsafe (ft .set_exception , excptn )
258260
259261 req_dict = req .req_to_dict (callback = _callback , errback = _errback )
260262 if not self .connected :
@@ -270,16 +272,16 @@ def _errback(ret: Any) -> None:
270272 return ft
271273
272274 def _execute_connect_request (self ) -> Future [None ]:
273- ft = self ._loop .create_future ()
275+ ft = self .loop .create_future ()
274276
275277 def _callback (_ ) -> None :
276278 if not ft .done ():
277- self ._loop .call_soon_threadsafe (ft .set_result , None )
279+ self .loop .call_soon_threadsafe (ft .set_result , None )
278280
279281 def _errback (ret : Any ) -> None :
280282 excptn = ErrorMapper .build_exception (ret )
281283 if not ft .done ():
282- self ._loop .call_soon_threadsafe (ft .set_exception , excptn )
284+ self .loop .call_soon_threadsafe (ft .set_exception , excptn )
283285
284286 req_dict = self ._connect_req .req_to_dict (callback = _callback , errback = _errback )
285287 self ._execute_req (ft , self ._connect_req .op_name , req_dict )
@@ -316,7 +318,10 @@ def _execute_req_sync(self, op_name: str, req_dict: Dict[str, Any]) -> Any:
316318
317319 def _get_loop (self , loop : Optional [AbstractEventLoop ] = None ) -> AbstractEventLoop :
318320 if not loop :
319- loop = get_event_loop ()
321+ if self ._loop_validator :
322+ loop = self ._loop_validator (loop )
323+ else :
324+ loop = get_event_loop ()
320325
321326 if not loop .is_running ():
322327 raise RuntimeError ('Event loop is not running.' )
0 commit comments