|
@@ -371,7 +371,10 @@ class ResultHandler(PoolThread):
|
|
|
return
|
|
|
|
|
|
if putlock is not None:
|
|
|
- putlock.release()
|
|
|
+ try:
|
|
|
+ putlock.release()
|
|
|
+ except ValueError:
|
|
|
+ pass
|
|
|
|
|
|
if self._state:
|
|
|
assert self._state == TERMINATE
|
|
@@ -389,7 +392,10 @@ class ResultHandler(PoolThread):
|
|
|
pass
|
|
|
|
|
|
if putlock is not None:
|
|
|
- putlock.release()
|
|
|
+ try:
|
|
|
+ putlock.release()
|
|
|
+ except ValueError:
|
|
|
+ pass
|
|
|
|
|
|
while cache and self._state != TERMINATE:
|
|
|
try:
|
|
@@ -470,7 +476,7 @@ class Pool(object):
|
|
|
self._worker_handler = self.Supervisor(self)
|
|
|
self._worker_handler.start()
|
|
|
|
|
|
- self._putlock = threading.Semaphore(self._processes)
|
|
|
+ self._putlock = threading.BoundedSemaphore(self._processes)
|
|
|
|
|
|
self._task_handler = self.TaskHandler(self._taskqueue, self._quick_put,
|
|
|
self._outqueue, self._pool)
|
|
@@ -529,6 +535,11 @@ class Pool(object):
|
|
|
if worker.exitcode is not None:
|
|
|
# worker exited
|
|
|
debug('cleaning up worker %d' % i)
|
|
|
+ if self._putlock is not None:
|
|
|
+ try:
|
|
|
+ self._putlock.release()
|
|
|
+ except ValueError:
|
|
|
+ pass
|
|
|
worker.join()
|
|
|
del self._pool[i]
|
|
|
return len(self._pool) < self._processes
|