Spaces:
Sleeping
Sleeping
Claude commited on
Revert "fix(ci): cure du hang _python_exit sur Python 3.12 ubuntu (cause racine)"
Browse filesThis reverts commit 5ac2ee16ba72845327b11f75cd682862da80407e.
picarones/measurements/runner/orchestration.py
CHANGED
|
@@ -321,21 +321,8 @@ def run_benchmark(
|
|
| 321 |
processed_count += 1
|
| 322 |
|
| 323 |
finally:
|
|
|
|
| 324 |
pbar.close()
|
| 325 |
-
# Sur Python 3.12+, ``ProcessPoolExecutor.shutdown(wait=False)``
|
| 326 |
-
# laisse les workers vivants ; l'atexit ``_python_exit`` de
|
| 327 |
-
# ``concurrent.futures.process`` essaie ensuite de les
|
| 328 |
-
# joindre indéfiniment, ce qui hang la CI Ubuntu (exit
|
| 329 |
-
# code 124 après timeout GNU 9 min). Le ``ThreadPoolExecutor``
|
| 330 |
-
# n'a pas ce problème (les threads daemon meurent avec le
|
| 331 |
-
# processus). ``cancel_futures=True`` annule les futures en
|
| 332 |
-
# attente dans les deux cas ; le ``wait=True`` côté process
|
| 333 |
-
# garantit que les workers en cours finissent leur batch et
|
| 334 |
-
# libèrent leurs sous-processus avant le retour.
|
| 335 |
-
executor.shutdown(
|
| 336 |
-
wait=is_cpu_bound,
|
| 337 |
-
cancel_futures=True,
|
| 338 |
-
)
|
| 339 |
|
| 340 |
if _is_cancelled():
|
| 341 |
logger.info(
|
|
|
|
| 321 |
processed_count += 1
|
| 322 |
|
| 323 |
finally:
|
| 324 |
+
executor.shutdown(wait=False, cancel_futures=True)
|
| 325 |
pbar.close()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 326 |
|
| 327 |
if _is_cancelled():
|
| 328 |
logger.info(
|
tests/conftest.py
CHANGED
|
@@ -120,41 +120,3 @@ def pytest_sessionfinish(session, exitstatus) -> None: # noqa: ARG001
|
|
| 120 |
repeat=False,
|
| 121 |
file=sys.stderr,
|
| 122 |
)
|
| 123 |
-
|
| 124 |
-
# Garde-fou final contre le hang ``_python_exit`` du
|
| 125 |
-
# ``concurrent.futures.process`` sur Python 3.12+. Si un test
|
| 126 |
-
# a créé un ``ProcessPoolExecutor`` sans le shutdown, ses
|
| 127 |
-
# workers (sous-processus) restent enregistrés dans
|
| 128 |
-
# ``_threads_wakeups`` ; au moment du shutdown global de
|
| 129 |
-
# l'interpréteur, ``_python_exit`` essaie de les joindre via
|
| 130 |
-
# ``Process.join()`` qui hang indéfiniment sur la CI Ubuntu
|
| 131 |
-
# (exit code 124 après timeout GNU 9 min).
|
| 132 |
-
#
|
| 133 |
-
# On force la terminaison de tous les sous-processus restants
|
| 134 |
-
# AVANT que l'interpréteur ne sorte. Si un test a oublié son
|
| 135 |
-
# cleanup, ça remplace le hang silencieux par une terminaison
|
| 136 |
-
# rapide ; le ``faulthandler.dump_traceback_later(60)`` ci-dessus
|
| 137 |
-
# signalera quand même la fuite dans les logs CI pour la
|
| 138 |
-
# corriger à la source.
|
| 139 |
-
import multiprocessing
|
| 140 |
-
|
| 141 |
-
for proc in multiprocessing.active_children():
|
| 142 |
-
try:
|
| 143 |
-
proc.terminate()
|
| 144 |
-
except Exception as exc: # noqa: BLE001
|
| 145 |
-
sys.stderr.write(
|
| 146 |
-
f"[conftest] échec terminate({proc.name}) : {exc}\n",
|
| 147 |
-
)
|
| 148 |
-
|
| 149 |
-
# Empêche ``_python_exit`` d'essayer de joindre des executors
|
| 150 |
-
# qui n'existent plus ou dont les workers viennent d'être
|
| 151 |
-
# terminés à la main ci-dessus.
|
| 152 |
-
try:
|
| 153 |
-
from concurrent.futures import process as _futures_process
|
| 154 |
-
|
| 155 |
-
if hasattr(_futures_process, "_threads_wakeups"):
|
| 156 |
-
_futures_process._threads_wakeups.clear()
|
| 157 |
-
except Exception as exc: # noqa: BLE001 # pragma: no cover
|
| 158 |
-
sys.stderr.write(
|
| 159 |
-
f"[conftest] cleanup _threads_wakeups : {exc}\n",
|
| 160 |
-
)
|
|
|
|
| 120 |
repeat=False,
|
| 121 |
file=sys.stderr,
|
| 122 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|