@@ -85,23 +85,37 @@ def complete(self, result: List[OUT]):
8585 if not self ._completed .compare_and_set (False , True ):
8686 return
8787
88+ self ._complete_internal (result )
89+
90+ def _complete_internal (self , result : List [OUT ]):
8891 if isinstance (result , Iterable ):
8992 self ._process_results (result )
9093 else :
94+ if result is None :
95+ self ._exception_handler (
96+ RuntimeError ("The result of AsyncFunction cannot be none, "
97+ "please check the methods 'async_invoke' and "
98+ "'timeout' of class '%s'." % self ._classname ))
99+ else :
100+ self ._exception_handler (
101+ RuntimeError ("The result of AsyncFunction should be of list type, "
102+ "please check the methods 'async_invoke' and "
103+ "'timeout' of class '%s'." % self ._classname ))
104+
91105 # complete with empty result, so that we remove timer and move ahead processing
92106 self ._process_results ([])
93107
94- raise RuntimeError ("The 'result_future' of AsyncFunction should be completed with "
95- "data of list type, please check the methods 'async_invoke' and "
96- "'timeout' of class '%s'." % self ._classname )
97-
98108 def complete_exceptionally (self , error : Exception ):
99109 # already completed, so ignore exception
100110 if not self ._completed .compare_and_set (False , True ):
101111 return
102112
103- self ._exception_handler (
104- Exception ("Could not complete the element:" + str (self ._record ), error ))
113+ self ._complete_exceptionally_internal (error )
114+
115+ def _complete_exceptionally_internal (self , error : Exception ):
116+ self ._exception_handler (Exception (
117+ "Error happens inside the class '%s' during handling input '%s'"
118+ % (self ._classname , str (self ._record )), error ))
105119
106120 # complete with empty result, so that we remove timer and move ahead processing
107121 self ._process_results ([])
@@ -114,12 +128,14 @@ def _process_results(self, result: List[OUT]):
114128 self ._result_future .complete (result )
115129
116130 def _timer_triggered (self ):
117- if not self ._completed .get ():
118- try :
119- result = self ._timeout_func (self ._record )
120- self ._result_future .complete (result )
121- except Exception as e :
122- self ._result_future .complete_exceptionally (e )
131+ if not self ._completed .compare_and_set (False , True ):
132+ return
133+
134+ try :
135+ result = self ._timeout_func (self ._record )
136+ self ._complete_internal (result )
137+ except Exception as error :
138+ self ._complete_exceptionally_internal (error )
123139
124140
125141class RetryableResultHandler (ResultFuture , Generic [IN , OUT ]):
@@ -166,7 +182,7 @@ def _process_retry(self, result: Optional[List[OUT]], error: Optional[Exception]
166182 self ._delayed_retry_timer = threading .Timer (next_backoff_time_sec , self ._do_retry )
167183 self ._delayed_retry_timer .start ()
168184 else :
169- if result is not None :
185+ if error is None :
170186 self ._result_handler .complete (result )
171187 else :
172188 self ._result_handler .complete_exceptionally (error )
@@ -189,18 +205,20 @@ def _timer_triggered(self):
189205 """
190206 Rewrite the timeout process to deal with retry state.
191207 """
192- if not self ._result_handler ._completed .get ():
193- # cancel delayed retry timer first
194- self ._cancel_retry_timer ()
208+ if not self ._result_handler ._completed .compare_and_set (False , True ):
209+ return
195210
196- # force reset _retry_awaiting to prevent the handler to trigger retry unnecessarily
197- self ._retry_awaiting . set ( False )
211+ # cancel delayed retry timer first
212+ self ._cancel_retry_timer ( )
198213
199- try :
200- result = self ._result_handler ._timeout_func (self ._result_handler ._record )
201- self ._result_handler .complete (result )
202- except Exception as e :
203- self ._result_handler .complete_exceptionally (e )
214+ # force reset _retry_awaiting to prevent the handler to trigger retry unnecessarily
215+ self ._retry_awaiting .set (False )
216+
217+ try :
218+ result = self ._result_handler ._timeout_func (self ._result_handler ._record )
219+ self ._result_handler ._complete_internal (result )
220+ except Exception as e :
221+ self ._result_handler ._complete_exceptionally_internal (e )
204222
205223
206224class Emitter (threading .Thread ):
0 commit comments