@@ -161,7 +161,7 @@ def _start_thread(self):
161161 target = Queue ._feed ,
162162 args = (self ._buffer , self ._notempty , self ._send_bytes ,
163163 self ._wlock , self ._writer .close , self ._ignore_epipe ,
164- self ._on_queue_feeder_error ),
164+ self ._on_queue_feeder_error , self . _sem ),
165165 name = 'QueueFeederThread'
166166 )
167167 self ._thread .daemon = True
@@ -203,7 +203,7 @@ def _finalize_close(buffer, notempty):
203203
204204 @staticmethod
205205 def _feed (buffer , notempty , send_bytes , writelock , close , ignore_epipe ,
206- onerror ):
206+ onerror , queue_sem ):
207207 debug ('starting thread to feed data to pipe' )
208208 nacquire = notempty .acquire
209209 nrelease = notempty .release
@@ -255,6 +255,12 @@ def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe,
255255 info ('error in queue thread: %s' , e )
256256 return
257257 else :
258+ # Since the object has not been sent in the queue, we need
259+ # to decrease the size of the queue. The error acts as
260+ # if the object had been silently removed from the queue
261+ # and this step is necessary to have a properly working
262+ # queue.
263+ queue_sem .release ()
258264 onerror (e , obj )
259265
260266 @staticmethod
0 commit comments