Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

thread waiting for input survives the end of execution

Aberta
#452 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
45/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Estagnada
Stack de tecnologia
jupyter, python
Domínio
backend

Direção de pesquisa

Comece em ipykernel/kernelbase.py, em Kernel._input_request, e reproduza os dois cenários de entrada em threads descritos na issue. Rastreie como o fechamento de stdin_socket e self.session.recv interagem após o fim da execução; a tarefa estará concluída quando uma entrada pendente em uma thread não travar mais nem corromper uma solicitação de entrada posterior.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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'{}'
Linguagem predominante
Python
Estrelas
734
Forks
411
Merge médio
1d 2h
PRs com merge (30d)
9

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de ipython/ipykernel

Todas as issues de ipython/ipykernel

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.