Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Setting limits in sub-process

Abierto
#176 5 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
25/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
python

Línea de trabajo

Start by reproducing the supplied multiprocessing fork example on AlmaLinux 8.9 with Python 3.12.3 and threadpoolctl 3.4.0, then trace the library scan through libc.dl_iterate_phdr and match_library. Compare the behavior with CentOS 7; the issue reports the scan hanging in the newer environment. Done means identifying and fixing the hang, with a regression test for the reported subprocess scenario.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Calling threadpool_limits in a sub-process fails (hangs) on some of my servers but fails in ones with a specific OS version:

$ hostnamectl
   Static hostname: n86.my.domain
         Icon name: computer-server
           Chassis: server
        Machine ID: 196b497eccff4526a8e34834c95e3de5
           Boot ID: b8318d26cd394a85b706beb2d7324f73
  Operating System: AlmaLinux 8.9 (Midnight Oncilla)
       CPE OS Name: cpe:/o:almalinux:almalinux:8::baseos
            Kernel: Linux 4.18.0-513.18.2.el8_9.x86_64
      Architecture: x86-64

The code is:

import os
import sys
from threadpoolctl import threadpool_limits
from multiprocessing import get_context

def eprintln(text):
    print(text, file=sys.stderr, flush=True)

DID_THREADCTL_FOR_PID = None

def invocation(index: int) -> int:
    global DID_THREADCTL_FOR_PID
    if os.getpid() != DID_THREADCTL_FOR_PID:
        DID_THREADCTL_FOR_PID = os.getpid()
        eprintln(f"PID: {os.getpid()} invocation index: {index} Do threadpool_limits...")
        threadpool_limits(limits=1)
        eprintln(f"PID: {os.getpid()} invocation index: {index} Did threadpool_limits.")
    else:
        eprintln(f"PID: {os.getpid()} invocation index: {index} Old threadpool_limits.")
    return index

invocations = 4
processes = 2
threadpool_limits(limits=processes)

results = [None] * invocations
eprintln(f"PID: {os.getpid()} Do imap...")
with get_context("fork").Pool(2) as pool:
    for index in pool.imap_unordered(invocation, range(invocations)):
        results[index] = index
        eprintln(f"PID: {os.getpid()} - Did imap index: {index}")

eprintln(f"PID: {os.getpid()} Did imap results: {results}")
assert results == list(range(len(results)))

When I run it on the above OS, in Python 3.12.3, threadpoolctl version 3.4.0, I get:

$ python3 bug.py 
PID: 1576849 Do imap...
PID: 1576852 invocation index: 0 Do threadpool_limits...
PID: 1576853 invocation index: 1 Do threadpool_limits...
PID: 1576853 invocation index: 1 Did threadpool_limits.
PID: 1576853 invocation index: 2 Old threadpool_limits.
PID: 1576853 invocation index: 3 Old threadpool_limits.
PID: 1576849 - Did imap index: 1
PID: 1576849 - Did imap index: 2
PID: 1576849 - Did imap index: 3

And the process hangs. Poking around it seems that libc.dl_iterate_phdr does not return (each match_library_callback call does return). I am using a Python 3.12.3 that was compiled from source on this OS, followed by pip installation of numpy, pandas, scipy etc.

This same thing works fine in older versions of the OS. E.g., in:

$ hostnamectl
   Static hostname: n97.my.domain
         Icon name: computer-server
           Chassis: server
        Machine ID: 5e543d50691943628e8e20441f502406
           Boot ID: 0d876250c0ec4a149e8bdb12c99c20eb
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.15.2.el7.x86_64
      Architecture: x86-64

With Python version 3.12.2, again with threadpoolctl version 3.4.0, I get the expected output:

$ python3 bug.py 
PID: 32872 Do imap...
PID: 32874 invocation index: 0 Do threadpool_limits...
PID: 32875 invocation index: 1 Do threadpool_limits...
PID: 32874 invocation index: 0 Did threadpool_limits.
PID: 32875 invocation index: 1 Did threadpool_limits.
PID: 32874 invocation index: 2 Old threadpool_limits.
PID: 32872 - Did imap index: 0
PID: 32875 invocation index: 3 Old threadpool_limits.
PID: 32872 - Did imap index: 1
PID: 32872 - Did imap index: 2
PID: 32872 - Did imap index: 3
PID: 32872 Did imap results: [0, 1, 2, 3]

Any ideas on what I can do to fix this?

Lenguaje dominante
Python
Estrellas
434
Forks
38
Merge medio
2 d 14 h
PR fusionados (30 d)
8

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de joblib/threadpoolctl

Todos los issues de joblib/threadpoolctl

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.