Inconsistent KeyboardInterrupt Handling in multiprocessing due to Context Manager Order
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 77.2k
- Fork
- 35.9k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
Bug report
Bug description:
When using multiprocessing.Manager with concurrent.futures.ProcessPoolExecutor, there is a particular ordering of the context managers that results in multiprocessing.managers.py hanging in the method serve_forever, forever. This can be triggered by raising a KeyboardInterrupt while the child process(es), here something, are busy. The ordering that leads to the bug is: Manager first, then ProcessPoolExecutor inside.
import multiprocessing
from concurrent.futures import ProcessPoolExecutor
from time import sleep
def something():
sleep(10)
# Uncomment one of the following blocks
### Works correctly:
# # Interrupt with CTRL+C while `something` is busy
# # Takes just one KeyboardInterrupts to terminate fully
# with ProcessPoolExecutor() as executor:
# futures = []
# with multiprocessing.Manager() as manager:
# futures.append(executor.submit(something))
#
# for f in futures:
# f.result()
### Doesn't work correctly, will hang often, try it a few times:
# # Interrupt with CTRL+C while `something` is busy
# # Takes one KeyboardInterrupts to get stuck, and another to terminate fully
# with multiprocessing.Manager() as manager:
# with ProcessPoolExecutor() as executor:
# futures = [executor.submit(something)]
#
# for f in futures:
# f.result()
I am not too familiar with the exact inner workings of these two context managers, but as a user, there was at least nothing to make me aware that the 2nd example is bad. If it's not a bug, and just incorrect ordering, perhaps ProcessPoolExecutor could raise an exception or print a warning that it shouldn't be used inside a Manager context in such a way.
CPython versions tested on:
3.9, 3.10, 3.11, 3.12
Operating systems tested on:
Linux
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia riproducendo i due ordinamenti dei gestori di contesto con l’esempio fornito di ProcessPoolExecutor e multiprocessing.Manager, quindi esamina multiprocessing.managers.py in serve_forever e i relativi percorsi di arresto. Il lavoro è completato quando l’ordinamento problematico non si blocca più dopo KeyboardInterrupt ed entrambi gli ordinamenti terminano in modo coerente; nell’issue non è indicato alcun file di test.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- distributed-systems
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100