MagicStack / MagicStack/uvloop
echoclient.py fails on recent MacOS and Linux Python releases that default to the spawn start‑method
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Cython
- Estrellas
- 11.9k
- Forks
- 616
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
Recent Python releases on macOS and Linux use the spawn start‑method by default for new processes.
IIRC spawn starts a brand‑new interpreter and imports the target module it relies on pickling to transport the target function.
As only module‑level objects can be pickled and run_test is defined inside the if __name__ == "__main__" block, the child process tries to unpickle and look up as an attribute of the module __mp_main__. That attribute does not exist, and the unpickler raises:
Process ForkServerProcess-2:
File "/usr/lib/python3.14/multiprocessing/process.py", line 320, in _bootstrap
self.run()
~~~~~~~~^^
File "/usr/lib/python3.14/multiprocessing/process.py", line 108, in run
self._target(*self._args, **self._kwargs)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/concurrent/futures/process.py", line 242, in _process_worker
call_item = call_queue.get(block=True)
File "/usr/lib/python3.14/multiprocessing/queues.py", line 120, in get
return _ForkingPickler.loads(res)
~~~~~~~~~~~~~~~~~~~~~^^^^^
AttributeError: module '__mp_main__' has no attribute 'run_test'
I am not filing a pull request because there are at least three fixes, and which one is implemented depends on the project team's preferences.
The options I see that fit the file's stated minimal changes from upstream constraint:
- Move
run_testto the module level. - As this is I/O bound, change to the
ThreadPoolExecutor - Force the use of
fork()
import multiprocessing
multiprocessing.set_start_method('fork', force=True)
All three options seem to benchmark close to each other on Linux/MacOS. Personally I lean towards the ThreadPoolExecutor option as that is my personal default for I/O bound concurrent operations.
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con echoclient.py, especialmente con la definición de run_test dentro del bloque main y la configuración de su grupo de procesos. Revisa los tres enfoques propuestos frente a la restricción del proyecto de realizar cambios mínimos y, después, ejecuta el cliente en una versión de Python usando spawn para confirmar que el fallo se ha resuelto sin cambiar su comportamiento previsto.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- testing
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100