Claude commited on
Commit
f7c129e
·
unverified ·
1 Parent(s): 5ac2ee1

Revert "fix(ci): cure du hang _python_exit sur Python 3.12 ubuntu (cause racine)"

Browse files

This 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
  )