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

thread waiting for input survives the end of execution

Abierto
#452 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

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

Línea de trabajo

Empieza en ipykernel/kernelbase.py, en Kernel._input_request, y reproduce los dos escenarios de entrada en hilos del issue. Sigue cómo interactúan el cierre de stdin_socket y self.session.recv después de que termina la ejecución; se considera terminado cuando una entrada pendiente en un hilo ya no se queda bloqueada ni corrompe una solicitud de entrada posterior.

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

Descripción

If a thread asks for input after the end of execution, it will crash as expected. If it asks for input before the end of execution, it will hang in a strange state that will crash ipykernel as soon as another input request is sent.

The offending line is: self.session.recv(self.stdin_socket, 0) in kernelbase.Kernel._input_request. If stdin_socket.close() is called before recv, it will crash. If stdin_socket.close() is called after self.session.recv(self.stdin_socket, 0), it will hang forever.

Ask after end
In [1]: import threading
   ...: import time
   ...: 
   ...: def getinput():
   ...:     time.sleep(1)
   ...:     print(input('thread:'))
   ...: 
   ...: thread = threading.Thread(target=getinput)
   ...: thread.start()
   ...: time.sleep(0.5)
thread:Exception in thread Thread-12:
Traceback (most recent call last):
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "<ipython-input-1-2acffc6600f3>", line 6, in getinput
    print(input('thread:'))
EOFError: EOF when reading a line


In [2]: print(input('main:'))

main:test
test

In [3]: 
Ask before end
In [1]: import threading
   ...: import time
   ...: 
   ...: def getinput():
   ...:     time.sleep(0.5)
   ...:     print(input('thread:'))
   ...: 
   ...: thread = threading.Thread(target=getinput)
   ...: thread.start()
   ...: time.sleep(1)

thread:

In [2]: print(input('main:'))

main:hi
[IPKernelApp] WARNING | Invalid Message:
Traceback (most recent call last):
  File "/Users/quentinpeter/pyscripts/ipykernel/ipykernel/kernelbase.py", line 884, in _input_request
    ident, reply = self.session.recv(self.stdin_socket, 0)
  File "/usr/local/lib/python3.7/site-packages/jupyter_client/session.py", line 835, in recv
    idents, msg_list = self.feed_identities(msg_list, copy)
  File "/usr/local/lib/python3.7/site-packages/jupyter_client/session.py", line 866, in feed_identities
    idx = msg_list.index(DELIM)
ValueError: b'<IDS|MSG>' is not in list
[IPKernelApp] WARNING | Invalid Message:
Traceback (most recent call last):
  File "/Users/quentinpeter/pyscripts/ipykernel/ipykernel/kernelbase.py", line 884, in _input_request
    ident, reply = self.session.recv(self.stdin_socket, 0)
  File "/usr/local/lib/python3.7/site-packages/jupyter_client/session.py", line 840, in recv
    raise e
  File "/usr/local/lib/python3.7/site-packages/jupyter_client/session.py", line 837, in recv
    return idents, self.deserialize(msg_list, content=content, copy=copy)
  File "/usr/local/lib/python3.7/site-packages/jupyter_client/session.py", line 945, in deserialize
    raise ValueError("Invalid Signature: %r" % signature)
ValueError: Invalid Signature: b'{}'
Lenguaje dominante
Python
Estrellas
734
Forks
411
Merge medio
1 d 2 h
PR fusionados (30 d)
9

Guía de contribución

Abrir la guía de contribución

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 ipython/ipykernel

Todos los issues de ipython/ipykernel

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.