Message367486
I can't be certain for the other failures, but I'm currently exploring a potential solution for addressing the `test_killed_child` failure. To me, it seems to be a race condition with attempting to call _ThreadWakeup.close() while there are still bytes being sent. IMO, we should wait until closing the pipe's reader and writer until it's finished sending or receiving bytes. Here's one way to implement that w/ threading.Event:
diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py
index 8e9b69a8f0..9bf073fc34 100644
--- a/Lib/concurrent/futures/process.py
+++ b/Lib/concurrent/futures/process.py
@@ -68,21 +68,30 @@ class _ThreadWakeup:
def __init__(self):
self._closed = False
self._reader, self._writer = mp.Pipe(duplex=False)
+ # Used to ensure pipe is not closed while sending or receiving bytes
+ self._not_running = threading.Event()
+ # Initialize event as True
+ self._not_running.set()
def close(self):
if not self._closed:
+ self._not_running.wait()
self._closed = True
self._writer.close()
self._reader.close()
def wakeup(self):
if not self._closed:
+ self._not_running.clear()
self._writer.send_bytes(b"")
+ self._not_running.set()
def clear(self):
if not self._closed:
+ self._not_running.clear()
while self._reader.poll():
self._reader.recv_bytes()
+ self._not_running.set()
From using Victor's method of replicating the failure with inserting a `time.sleep(0.050)` in multiprocessing.Connection._send(), it appears to fix the failure in test_killed_child. I believe it would also fix the other failures since they appear to be caused by the same core issue, but I've been unable to replicate them locally so I'm not 100% certain. |
|
Date |
User |
Action |
Args |
2020-04-28 03:09:33 | aeros | set | recipients:
+ aeros, pitrou, vstinner |
2020-04-28 03:09:33 | aeros | set | messageid: <1588043373.82.0.392823623422.issue39995@roundup.psfhosted.org> |
2020-04-28 03:09:33 | aeros | link | issue39995 messages |
2020-04-28 03:09:33 | aeros | create | |
|