Bug report
The native_thread_id field of the PyThreadState object is not updated after a fork on Linux (at least). This means that child processes spawned by the main thread of the parent process will have a main thread with the parent thread ID.
The native_thread_id is meant to be consumed by tools like Austin and therefore the behaviour is easily observed with these tools. One way to reproduce this is to profile this with Austin
import multiprocessing
def fact(n):
f = 1
for i in range(1, n + 1):
f *= i
return f
def do(N):
n = 1
for _ in range(N):
fact(n)
n += 1
if __name__ == "__main__":
import sys
try:
nproc = int(sys.argv[1])
except Exception:
nproc = 2
processes = []
for _ in range(nproc):
process = multiprocessing.Process(target=do, args=(3000,))
process.start()
processes.append(process)
for process in processes:
process.join(timeout=5)
and observe that the reported thread IDs coincide with the parent's PID.
Your environment
- CPython versions tested on: 3.11.1
- Operating system and architecture: Ubuntu 22.04 (amd64)
Linked PRs
Bug report
The
native_thread_idfield of thePyThreadStateobject is not updated after a fork on Linux (at least). This means that child processes spawned by the main thread of the parent process will have a main thread with the parent thread ID.The
native_thread_idis meant to be consumed by tools like Austin and therefore the behaviour is easily observed with these tools. One way to reproduce this is to profile this with Austinand observe that the reported thread IDs coincide with the parent's PID.
Your environment
Linked PRs