@@ -592,6 +592,9 @@ def _handle_results(outqueue, get, cache):
592592 cache [job ]._set (i , obj )
593593 except KeyError :
594594 pass
595+ except Exception :
596+ # Even if we raised we still want to handle callbacks
597+ traceback .print_exc ()
595598 task = job = obj = None
596599
597600 while cache and thread ._state != TERMINATE :
@@ -609,6 +612,9 @@ def _handle_results(outqueue, get, cache):
609612 cache [job ]._set (i , obj )
610613 except KeyError :
611614 pass
615+ except Exception :
616+ # Even if we raised we still want to handle callbacks
617+ traceback .print_exc ()
612618 task = job = obj = None
613619
614620 if hasattr (outqueue , '_reader' ):
@@ -772,13 +778,15 @@ def get(self, timeout=None):
772778
773779 def _set (self , i , obj ):
774780 self ._success , self ._value = obj
775- if self ._callback and self ._success :
776- self ._callback (self ._value )
777- if self ._error_callback and not self ._success :
778- self ._error_callback (self ._value )
779- self ._event .set ()
780- del self ._cache [self ._job ]
781- self ._pool = None
781+ try :
782+ if self ._callback and self ._success :
783+ self ._callback (self ._value )
784+ if self ._error_callback and not self ._success :
785+ self ._error_callback (self ._value )
786+ finally :
787+ self ._event .set ()
788+ del self ._cache [self ._job ]
789+ self ._pool = None
782790
783791 __class_getitem__ = classmethod (types .GenericAlias )
784792
@@ -809,23 +817,27 @@ def _set(self, i, success_result):
809817 if success and self ._success :
810818 self ._value [i * self ._chunksize :(i + 1 )* self ._chunksize ] = result
811819 if self ._number_left == 0 :
812- if self ._callback :
813- self ._callback (self ._value )
814- del self ._cache [self ._job ]
815- self ._event .set ()
816- self ._pool = None
820+ try :
821+ if self ._callback :
822+ self ._callback (self ._value )
823+ finally :
824+ del self ._cache [self ._job ]
825+ self ._event .set ()
826+ self ._pool = None
817827 else :
818828 if not success and self ._success :
819829 # only store first exception
820830 self ._success = False
821831 self ._value = result
822832 if self ._number_left == 0 :
823833 # only consider the result ready once all jobs are done
824- if self ._error_callback :
825- self ._error_callback (self ._value )
826- del self ._cache [self ._job ]
827- self ._event .set ()
828- self ._pool = None
834+ try :
835+ if self ._error_callback :
836+ self ._error_callback (self ._value )
837+ finally :
838+ del self ._cache [self ._job ]
839+ self ._event .set ()
840+ self ._pool = None
829841
830842#
831843# Class whose instances are returned by `Pool.imap()`
0 commit comments