Tecnología · GUÍA PRÁCTICA
¿Falla el pool de procesos de Python 3.14 en un sandbox? Prueba primero el socket Unix de forkserver
El pool puede fallar antes de serializar tareas. Separa un directorio temporal no escribible de una denegación AF_UNIX y elige spawn, un worker o un contexto justificado.

Python 3.14 cambió el método predeterminado en POSIX compatibles de fork a forkserver. Ese valor más seguro crea un servidor separado y un socket Unix local, por lo que un trabajo restringido puede fallar antes de que un worker importe el módulo.
No llames error de pickle a todo ni uses fork como salida automática. Identifica si falla el almacenamiento temporal, la creación o bind de AF_UNIX, la longitud de ruta, la importación segura o la serialización de la tarea.
1. Ubica el fallo antes del primer worker
Registra sys.version, platform, get_start_method() y el traceback completo. Si termina en ensure_running, arbitrary_address, gettempdir o listener.bind, la función del usuario aún no empezó.
Separa ausencia de directorio temporal, ruta AF_UNIX demasiado larga y EPERM al crear o enlazar. PicklingError, AttributeError de función local o arranque recursivo posterior pertenecen a otra rama.
2. Prueba por separado el temporal y el socket Unix
Ejecuta una sonda desechable con el mismo sandbox y usuario. Crea un temporal, enlaza una ruta AF_UNIX local, cierra y elimina. No crea un servicio de red.
Si falla mkdtemp, repara el temporal o actualiza a un parche con fallback. Si el directorio funciona y AF_UNIX da EPERM, cambiar TMPDIR no concede esa capacidad. Si ambos pasan, prueba un pool forkserver de un elemento.
3. Lee correctamente el límite de versión
La documentación actual dice que forkserver es el valor POSIX compatible y que desde 3.14.9 spawn se usa cuando no hay temporal escribible. Versiones 3.14 anteriores podían lanzar OSError.
El fallback es estrecho. Un directorio escribible puede coexistir con AF_UNIX bloqueado; una ruta larga es otro fallo. Conserva excepción, parche y ruta exactos.
4. Elige la respuesta segura más estrecha
La aplicación puede usar get_context('spawn') o mp_context en ProcessPoolExecutor. Sitúa workers en el módulo, protege el punto de entrada y pasa datos serializables. Una biblioteca debe aceptar el contexto del llamador.
Si una CLI expone workers, usar uno suele ser el menor cambio. Si necesitas procesos paralelos, pide al dueño del entorno un permiso local estrecho; no eludas la política con un servicio remoto.
Usa fork solo si la aplicación demuestra que no copia estado inseguro de hilos o bibliotecas. Una sonda que funciona demuestra capacidad, no seguridad.
5. Revalida la semántica con spawn
spawn inicia un intérprete nuevo. Mueve funciones anidadas y lambdas al módulo, protege la entrada y recrea recursos por proceso en un inicializador. Los locks de contextos distintos pueden ser incompatibles.
No pases conexiones de base de datos, bucles de eventos o clientes vivos. Pasa configuración e identificadores y abre recursos dentro del worker.
6. Acepta con una matriz de límites
Registra creación del temporal, bind AF_UNIX, pool forkserver de un elemento y pool spawn de un elemento. Ejecuta la herramienta real con un worker y con el contexto elegido; guarda estado de salida y hashes.
Acepta solo si la rama prevista funciona, un objetivo inválido falla por importación o pickle como corresponde, no queda socket y la salida coincide con la base de un worker.
