concurrent.futures.wait() waits forever if given a cancelled future
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 77.2k
- Forks
- 36k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug report
concurrent.futures.wait() hangs if given a future that is already cancelled.
Steps to reproduce:
- Get a future that is cancellable (create lots of jobs such that the later ones cannot start yet and are therefore cancellable):
>>> import concurrent.futures
>>> pool = concurrent.futures.ThreadPoolExecutor(max_workers=1)
>>> import time
>>> for _ in range(1000): future = pool.submit(time.sleep, 1000)
- Cancel this future and note that it returns
Truemeaning it has been cancelled.
>>> future.cancel()
True
- Now waiting on this future hangs:
>>> concurrent.futures.wait([future])
The expected behaviour, regardless of the value of return_when is that wait() treats cancelled futures as already completed. This is essentially how return_when=FIRST_COMPLETED and return_when=ALL_COMPLETED are documented to behave:
The function will return when any future finishes or is cancelled.
and
The function will return when all futures finish or are cancelled.
Treating a future that is cancelled prior to wait() as different to one that changes state to cancelled once waiting risks a race condition: it could change state after any possible check but before blocking. i.e. it needs to be level-triggered not edge-triggered. And indeed, it works this way for futures that are done, just not ones that are cancelled.
Your environment
- CPython versions tested on: 3.9.7, 3.10.2
- Operating system and architecture: Linux
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne damit, das bereitgestellte Beispiel mit concurrent.futures.wait() und einem bereits abgebrochenen Future zu reproduzieren. Untersuche den Einstiegspunkt wait() und die Behandlung abgebrochener Futures und füge anschließend Tests für das gemeldete Verhalten hinzu. Fertig ist die Aufgabe, wenn wait() für die dokumentierten return_when-Werte zurückkehrt, statt hängen zu bleiben.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- backend
- Issue-Typ
- Bug
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Klar beschrieben
- Anfängerfreundlichkeit
- 52/100