@@ -141,11 +141,11 @@ def __init__(self, future, fn, args, kwargs):
141
141
self .kwargs = kwargs
142
142
143
143
class _ResultItem (object ):
144
- def __init__ (self , work_id , exception = None , result = None , pid = None ):
144
+ def __init__ (self , work_id , exception = None , result = None , exit_pid = None ):
145
145
self .work_id = work_id
146
146
self .exception = exception
147
147
self .result = result
148
- self .pid = pid
148
+ self .exit_pid = exit_pid
149
149
150
150
class _CallItem (object ):
151
151
def __init__ (self , work_id , fn , args , kwargs ):
@@ -202,14 +202,16 @@ def _process_chunk(fn, chunk):
202
202
return [fn (* args ) for args in chunk ]
203
203
204
204
205
- def _sendback_result (result_queue , work_id , result = None , exception = None , pid = None ):
205
+ def _sendback_result (result_queue , work_id , result = None , exception = None ,
206
+ exit_pid = None ):
206
207
"""Safely send back the given result or exception"""
207
208
try :
208
209
result_queue .put (_ResultItem (work_id , result = result ,
209
- exception = exception , pid = pid ))
210
+ exception = exception , exit_pid = exit_pid ))
210
211
except BaseException as e :
211
212
exc = _ExceptionWithTraceback (e , e .__traceback__ )
212
- result_queue .put (_ResultItem (work_id , exception = exc , pid = pid ))
213
+ result_queue .put (_ResultItem (work_id , exception = exc ,
214
+ exit_pid = exit_pid ))
213
215
214
216
215
217
def _process_worker (call_queue , result_queue , initializer , initargs , max_tasks = None ):
@@ -251,9 +253,11 @@ def _process_worker(call_queue, result_queue, initializer, initargs, max_tasks=N
251
253
r = call_item .fn (* call_item .args , ** call_item .kwargs )
252
254
except BaseException as e :
253
255
exc = _ExceptionWithTraceback (e , e .__traceback__ )
254
- _sendback_result (result_queue , call_item .work_id , exception = exc , pid = exit_pid )
256
+ _sendback_result (result_queue , call_item .work_id , exception = exc ,
257
+ exit_pid = exit_pid )
255
258
else :
256
- _sendback_result (result_queue , call_item .work_id , result = r , pid = exit_pid )
259
+ _sendback_result (result_queue , call_item .work_id , result = r ,
260
+ exit_pid = exit_pid )
257
261
del r
258
262
259
263
# Liberate the resource as soon as possible, to avoid holding onto
@@ -337,9 +341,9 @@ def run(self):
337
341
if result_item is not None :
338
342
self .process_result_item (result_item )
339
343
340
- process_exited = result_item .pid is not None
344
+ process_exited = result_item .exit_pid is not None
341
345
if process_exited :
342
- p = self .processes .pop (result_item .pid )
346
+ p = self .processes .pop (result_item .exit_pid )
343
347
p .join ()
344
348
345
349
# Delete reference to result_item to avoid keeping references
@@ -348,7 +352,8 @@ def run(self):
348
352
349
353
if executor := self .executor_reference ():
350
354
if process_exited :
351
- executor ._adjust_process_count ()
355
+ with self .shutdown_lock :
356
+ executor ._adjust_process_count ()
352
357
else :
353
358
executor ._idle_worker_semaphore .release ()
354
359
del executor
0 commit comments