multiprocessing.Queue.empty() returns False after all producers have exited on Windows 3.13.3
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
On Windows 11 with CPython 3.13.3 official installer, Queue.empty() incorrectly returns False when the producer process has already terminated, allowing a later-started consumer to successfully get() all buffered items. This contradicts the documented behaviour that empty() is only reliable while producers are alive.
To Reproduce
Save as clean_test.py:
Python
from multiprocessing import Process, Queue
def x(q):
for i in range(4):
q.put(i)
def y(q):
cnt = 0
while True:
if q.empty():
break
q.get()
cnt += 1
print('实际 get 次数:', cnt)
if __name__ == '__main__':
q = Queue()
p1 = Process(target=x, args=(q,))
p2 = Process(target=y, args=(q,))
p1.start()
p1.join() # producer already dead
p2.start()
p2.join()
Run:
powershell
python clean_test.py
Expected behaviour
Should print 实际 get 次数: 0 (consumer sees empty queue).
Actual behaviour
Prints 实际 get 次数: 4 (consumer successfully gets all items).
Environment
OS: Windows 11 (build 22631)
Python: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
Installer: official python.org x64 exe
File SHA-256: 4D8746575FF5D9062D159EB0C382589DBFEC56C942D23DA57E44CF1920312D57
Additional context
The same script always outputs 0 on Linux (CPython 3.11-3.13) and on Windows 10 with 3.11.
Appears to be Windows-specific and version-specific (3.13.3).
Guía de contribución
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 el reproductor clean_test.py y ejecútalo en Windows 11 con CPython 3.13.3; después, compara los resultados de Windows 10 y Linux descritos en el issue. Investiga multiprocessing.Queue.empty() y el ciclo de vida del producer/consumer; se considera terminado cuando el caso de Windows 3.13.3 informa de 0 elementos después de que el producer termina, sin introducir regresiones en los entornos de comparación.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- operating-systems
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 42/100