Skip to content

Commit

Permalink
pythongh-130954: Fix multiprocessing test_notify_n (pythonGH-130955)
Browse files Browse the repository at this point in the history
The test could deadlock trying join on the worker processes.
Apply the same technique as pythongh-130933.

Join the process before the test ends in `test_notify` as well.
(cherry picked from commit edd1eca336976b3431cf636aea87f08a40c94935)

Co-authored-by: Sam Gross <[email protected]>
  • Loading branch information
colesbury authored and miss-islington committed Mar 8, 2025
1 parent 597a953 commit f5f6b01
Showing 1 changed file with 13 additions and 8 deletions.
21 changes: 13 additions & 8 deletions Lib/test/_test_multiprocessing.py
Original file line number Diff line number Diff line change
Expand Up @@ -1609,12 +1609,10 @@ def test_notify(self):
p = self.Process(target=self.f, args=(cond, sleeping, woken))
p.daemon = True
p.start()
self.addCleanup(p.join)

p = threading.Thread(target=self.f, args=(cond, sleeping, woken))
p.daemon = True
p.start()
self.addCleanup(p.join)
t = threading.Thread(target=self.f, args=(cond, sleeping, woken))
t.daemon = True
t.start()

# wait for both children to start sleeping
sleeping.acquire()
Expand All @@ -1641,7 +1639,9 @@ def test_notify(self):

# check state is not mucked up
self.check_invariant(cond)
p.join()

threading_helper.join_thread(t)
join_process(p)

def test_notify_all(self):
cond = self.Condition()
Expand Down Expand Up @@ -1718,16 +1718,17 @@ def test_notify_n(self):
woken = self.Semaphore(0)

# start some threads/processes
workers = []
for i in range(3):
p = self.Process(target=self.f, args=(cond, sleeping, woken))
p.daemon = True
p.start()
self.addCleanup(p.join)
workers.append(p)

t = threading.Thread(target=self.f, args=(cond, sleeping, woken))
t.daemon = True
t.start()
self.addCleanup(t.join)
workers.append(t)

# wait for them to all sleep
for i in range(6):
Expand Down Expand Up @@ -1762,6 +1763,10 @@ def test_notify_n(self):
# check state is not mucked up
self.check_invariant(cond)

for w in workers:
# NOTE: join_process and join_thread are the same
threading_helper.join_thread(w)

def test_timeout(self):
cond = self.Condition()
wait = TimingWrapper(cond.wait)
Expand Down

0 comments on commit f5f6b01

Please sign in to comment.