fperrin · GitHub

Bug report

Bug description:

Hi,

With the recent change that Python now throws a warning for programs that fork() when there are more than one threads. I was hoping to use -Werror to find and pinpoint all such occurrences in my software.

Using python3.13 as installed by uv (cpython-3.13.4-linux-x86_64-gnu). With the following test code:

import os, sys, threading, time
t = threading.Thread(target=time.sleep, args=(1,), daemon=True)
t.start()
assert threading.active_count() == 2
pid = os.fork()
if pid < 0:
    print(f"fork failed: {pid=}")
elif pid == 0:
    print(f"after fork, I am {os.getpid()=}; {threading.active_count()=}")
    sys.exit(0)
print(f"successful fork; I am {os.getpid()=}, child is {pid=}; {threading.active_count()=}")
pid, _ = os.forkpty()
if pid < 0:
    print(f"forkpty failed: {pid=}")
elif pid == 0:
    print(f"after forkpty, I am {os.getpid()=}; {threading.active_count()=}")
    sys.exit(0)
print(f"successful forkpty; I am {os.getpid()=}, child is {pid=}; {threading.active_count()=}")

Running with -Walways gives me the expected warnings:

$ python3 -Walways ex.py
after fork, I am os.getpid()=275006; threading.active_count()=1
/home/fred/demo/ex.py:8: DeprecationWarning: This process (pid=275004) is multi-threaded, use of fork() may lead to deadlocks in the child.
  pid = os.fork()
successful fork; I am os.getpid()=275004, child is pid=275006; threading.active_count()=2
/home/fred/demo/ex.py:16: DeprecationWarning: This process (pid=275004) is multi-threaded, use of forkpty() may lead to deadlocks in the child.
  pid, _ = os.forkpty()
successful forkpty; I am os.getpid()=275004, child is pid=275007; threading.active_count()=2

However, running with -Werror, the code silently run (no exception raised, no warning printed):

$ python3 --version
Python 3.13.4
$ python3 -Werror ex.py
successful fork; I am os.getpid()=275060, child is pid=275062; threading.active_count()=2
after fork, I am os.getpid()=275062; threading.active_count()=1
successful forkpty; I am os.getpid()=275060, child is pid=275063; threading.active_count()=2

CPython versions tested on:

3.13

Operating systems tested on:

Linux

Linked PRs

Read the original on github.com ↗