ipython / ipython/ipykernel

thread waiting for input survives the end of execution

Abierto
#452 0 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Python
Estrellas
734
Forks
412
Merge medio
1 d 5 h
PR fusionados (30 d)
8

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
```python
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 "", 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
```python
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'' 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'{}'
```

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.