Watch at EaseHistorias. Respuestas. Perspectiva.

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.

Flujo de diagnóstico desde el proceso principal por el temporal y el socket AF_UNIX hasta forkserver.
Ilustración editorial original: localiza el fallo previo al worker antes de cambiar la semántica multiproceso. Watch at Ease

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.

Comparación de requisitos, señales y primera decisión para forkserver, spawn y fork.
Ilustración técnica original: elige el contexto como contrato de aplicación, no como interruptor intercambiable. Watch at Ease