From 8f89ef90d2e6c4356bb3b3fbb6b34f7e137903c3 Mon Sep 17 00:00:00 2001 From: Kyle Stanley Date: Mon, 27 Apr 2020 23:48:55 -0400 Subject: [PATCH] Fix ProcessPoolExecutor._ThreadWakeup race condition --- Lib/concurrent/futures/process.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 8e9b69a8f08b42..97578994a6c4f0 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._closed = True + self._not_running.wait() 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() def _python_exit():