You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Fork server doesn't flush stdout/stderr after preloading modules, potentially leaving buffered data to be inherited by child processes #135335
importosimporttimeprint(f"init {os.getpid()} at {time.clock_gettime_ns(time.CLOCK_MONOTONIC)}")
repro.py
importmultiprocessingimportosimporttimeif__name__=='__main__':
print(f"run main {os.getpid()}")
multiprocessing.set_forkserver_preload(['a'])
for_inrange(2):
p=multiprocessing.Process()
p.start()
p.join()
else:
print(f"re-import main {os.getpid()} at {time.clock_gettime_ns(time.CLOCK_MONOTONIC)}")
Reproduction
Create a new module a containing the __init__.py file above
Run the repro.py script above, ensuring the module created is on PYTHONPATH
Result
> ./python repro.py
run main 1056488
init 1056490 at 151009034069836
re-import main 1056491 at 151009045273212
re-import main 1056492 at 151009051787587
> ./python repro.py | tee /dev/null
run main 1056607
init 1056610 at 151113770440639
re-import main 1056611 at 151113781130002
init 1056610 at 151113770440639
re-import main 1056612 at 151113787814593
init 1056610 at 151113770440639
Expected
The output to be the same when stdout is redirected as when it is not.
Analysis
This is due to fork server preloading a module that writes to stdout, but not flushing it. When a child process is spawned it inherits the buffered data and spuriously outputs it when it flushes itsstdout. Note that #126631 prevents __main__ from being preloaded, so at present this will not be triggered by printing from __main__.
Activity
pythongh-135335: flush stdout/stderr in forkserver after preloading m…
efimov-mikhail commentedon Jun 17, 2025
Confirmed, this bug can be reproduced.
gh-135335: flush stdout/stderr in forkserver after preloading modules (…
pythongh-135335: flush stdout/stderr in forkserver after preloading m…
pythongh-135335: flush stdout/stderr in forkserver after preloading m…
Remove work-around for pythongh-135335 now it has been fixed.
[3.13] gh-135335: flush stdout/stderr in forkserver after preloading …
[3.14] gh-135335: flush stdout/stderr in forkserver after preloading …
pythongh-135335: flush stdout/stderr in forkserver after preloading m…
pythongh-135335: flush stdout/stderr in forkserver after preloading m…
pythongh-135335: flush stdout/stderr in forkserver after preloading m…
pythongh-135335: flush stdout/stderr in forkserver after preloading m…
Simplify preload regression test using __main__
Merge branch 'main' into pythongh-135335-simplify-test
gh-135335: Simplify preload regression test using __main__ (GH-138686)
pythongh-135335: Simplify preload regression test using __main__ (pyt…
pythongh-135335: Simplify preload regression test using __main__ (pyt…
[3.14] gh-135335: Simplify preload regression test using __main__ (GH…
[3.13] gh-135335: Simplify preload regression test using __main__ (GH…
pythongh-135335: Simplify preload regression test using __main__ (pyt…
pythongh-135335: Simplify preload regression test using __main__ (pyt…
Merge main into forkserver on_error branch