python / python/cpython

ThreadPoolExecutor marks interpreter as shutdown before non daemon threads exit

Abierto
#148,280 1 comentario 0 reacciones 1 asignado Ver en GitHub

@ZeroIntensity ya está trabajando en esto.

Desde el 9/4/2026.

3.15 stdlib triaged type-bug
Lenguaje dominante
Python
Estrellas
77.2k
Forks
35.9k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

Bug report

Bug description:

When the main thread exits, concurrent.futures.ThreadPoolExecutor mistakenly marks the interpreter as shutdown, regardless of if there are non daemon threads still executing, this causes any work submitted to the executor to fail with RuntimeError: cannot schedule new futures after interpreter shutdown.

PoC:

import time
import threading

from concurrent.futures import ThreadPoolExecutor

def work():
    print("Starting work")
    time.sleep(1)
    print("Work complete")

def worker_thread():
    # sleep a little to give the main thread time to exit
    time.sleep(1)

    executor = ThreadPoolExecutor()
    
    future = executor.submit(work)
    

def main():
    thread = threading.Thread(target=worker_thread)
    thread.start()

    # main thread exits now

if __name__ == "__main__":
    main()

Result

Exception in thread Thread-1 (worker_thread):
Traceback (most recent call last):
  File "/usr/lib/python3.14/threading.py", line 1081, in _bootstrap_inner
    self._context.run(self.run)
    ~~~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/lib/python3.14/threading.py", line 1023, in run
    self._target(*self._args, **self._kwargs)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/*****/*****/implementation/./bug.py", line 18, in worker_thread
    future = executor.submit(work)
  File "/usr/lib/python3.14/concurrent/futures/thread.py", line 207, in submit
    raise RuntimeError('cannot schedule new futures after '
                       'interpreter shutdown')
RuntimeError: cannot schedule new futures after interpreter shutdown

Interpreter is marked as shutdown here: https://github.com/python/cpython/blob/f46a17b19ff535591b75f5f3df5b48f7b4f939b4/Lib/concurrent/futures/thread.py#L23-L37
Expected Result:
All non daemon threads should be able to use ThreadPoolExecutor until they exit.

example was tested on 3.14.0

cc @ZeroIntensity

CPython versions tested on:

3.14

Operating systems tested on:

Linux

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.