Ipython: Não é possível interromper loops infinitos no notebook

Criado em 13 jan. 2013  ·  29Comentários  ·  Fonte: ipython/ipython

Recentemente, dei uma introdução à programação Python no Workshop on Genomics. Para o tutorial, usamos a interface do notebook e foi muito bem recebido (obrigado!). Durante a discussão sobre loops, pedi aos alunos que convertessem um exemplo de loop for em um loop while. No processo, muitos dos alunos criaram loops infinitos. Para alguns desses alunos, ele travou o Firefox. A correção foi matar o servidor do notebook e matar o navegador. Todos os alunos estavam usando máquinas virtuais baseadas em Ubuntu e Firefox como navegador. Se isso ajudar, posso obter mais detalhes sobre os sistemas e investigar se posso recriar esse comportamento em minha cópia da máquina virtual.

needs-info

Comentários muito úteis

Acho que um de nós precisa encontrar um notebook simples que reproduza esse problema, pelo menos em algum sistema.

while True:
    print "foo"

Isso faz com que o Firefox use 100% da CPU e não responda de nenhuma forma ou forma. Matar o Firefox e o processo do IPython é a única maneira de recuperar o sistema.

Ipython 3.0.0
Firefox 42.0
Linux 3.13.0-24-genérico

Todos 29 comentários

Por acaso o travando produziria saída e não o que não travasse o navegador?
(você deve ter um kill kernel em um menu)

Provavelmente poderíamos ter um tempo limite de opt-in de segurança que mata o servidor se o kernel ficar ocupado por muito tempo ou o frontend receber muita entrada

Acho que há dois problemas aqui:

  • Interromper um loop infinito é perfeitamente possível. No menu Kernel, clique em interromper.
  • Se o seu loop imprimir algo em cada etapa, ele produzirá uma quantidade enorme de saída, o que pode causar problemas para o navegador. Veja também a edição nº 1975.

@Carreau não houve saída

@takluyver o menu do kernel não foi responsivo. Isso aconteceria com loops que estavam sendo impressos e loops que não estavam sendo impressos.

Você pode dar um exemplo de um loop onde ele não funciona?

Em 13 de janeiro de 2013 16:11, Daniel McDonald [email protected] escreveu:

@Carreau https://github.com/Carreau não houve saída

@takluyver https://github.com/takluyver o menu do kernel não foi
responsivo. Isso aconteceria com loops que estavam imprimindo e loops que
não estavam imprimindo.


Responda a este e-mail diretamente ou visualize-o no Gi tHubhttps://github.com/ipython/ipython/issues/2781#issuecomment -12195606.

Um algoritmo de anagrama ingênuo/horrível quando as palavras não são anagramas umas das outras

from random import shuffle 
word1 = list("quietx")
word2 = list("quite")
while word1 != word2:
    shuffle(word1)

Acabei de testar e posso interromper esse sem problemas no Firefox e no Ubuntu. Você pode replicá-lo de forma confiável em seu sistema?

Não consigo replicar no meu sistema. Vou rastrear os usuários que tiveram o problema e executar novamente em seus sistemas. As sessões do workshop recomeçam amanhã de manhã - o workshop é na Europa e hoje é um dia de folga - então vai demorar um pouco até que eu possa voltar a isso.

Não estou mais em condições de testar isso e não pude acompanhar no
oficina. Dado que eu não posso reproduzir o problema, nem qualquer outra pessoa,
vamos giz-lo até um acaso.

Obrigado novamente pela resposta rápida e peço desculpas por consumir tempo neste

No domingo, 13 de janeiro de 2013 às 9h57, Thomas Kluyver [email protected] escreveu :

Acabei de testar e posso interromper esse sem problemas no Firefox
& Ubuntu. Você pode replicá-lo de forma confiável em seu sistema?


Responda a este e-mail diretamente ou visualize-o no Gi tHubhttps://github.com/ipython/ipython/issues/2781#issuecomment -12196271.

Sem problemas. Sinta-se à vontade para reabrir se encontrar uma maneira de reproduzir o bug.

Eu recebo isso o tempo todo no notebook IPython no chrome (e acabei de testar no firefox, e "deu certo", ou seja, travou). Eu _acho_ que acontece sempre que tenho um loop infinito que imprime com frequência. É um problema para mim, porque muitas vezes estou colocando instruções de impressão para depurar e, nisso, perco o código que deveria corrigir meu bug por causa de uma falha.

Aqui está o código que usei para fazê-lo travar:

importar numpy como np
x = np.array([0,1,2,3,4])
it = np.nditer(x,flags=['f_index'])
enquanto não.terminado:
imprima.index

Isso acontece comigo também...
Primeiro, o navegador não responde e depois descubro todo o sistema travado. Sou forçado a fazer um hard-reset.
Eu uso o Ubuntu com xfce desktop/firefox.
Se for útil, eu estaria disposto a compartilhar quaisquer outros detalhes que você possa precisar para corrigir isso ...
@minrk

Este problema parece ainda estar lá!

Eu posso executar o "interromper" ou "Reiniciar" no menu do kernel, mas não surtiu efeito. o ícone de corrida ainda é exibido como uma bola preta.

Mesmo se eu reiniciar o computador, depois de clicar no notebook novamente, ele ficará em loop para sempre!

Estou usando o MacBook com o ipython 2.2.0 instalado.

Eu também tive esse problema: notebook ipython pendurado no navegador e incapaz de recuperar usando o kernel de interrupção. Além dos erros de loop, isso parece acontecer com qualquer processo de suspensão, por exemplo, se uma consulta de Internet dentro de uma função for interrompida por motivos de rede.

Minha pergunta é, existe uma maneira de acessar o kernel subjacente a partir da linha de comando? Eu inicio o notebook ipython a partir de um terminal e, no momento, minha solução é interromper o teclado nesse terminal, o que desliga o kernel completamente.

Eu também tenho esse problema crítico . Parece estar relacionado a loops de fato. Isso me impede de fazer longas simulações ou análises de dados, o que significa: estou ferrado...

Não sei se está relacionado, mas notei que, uma vez travado, o hyperthreading parece entrar em colapso em uma CPU ainda funcionando. Você pode ver isso usando htop , por exemplo. A princípio, parecia-me que o hyperthreading (que as bibliotecas numpy -> BLAS estão explorando na minha máquina) era o único a travar e então a coisa toda ficaria loucamente lenta, mas então tentei interromper e não tive sorte e então eu percebi que era o kernel do IPython apenas ficando preso.

Esse problema nunca me ocorreu quando:

  • Eu estava usando uma máquina mais antiga (mas ainda muito semelhante, apenas menos RAM e CPUs)
  • Eu estava usando o antigo ipython <3.0
  • Eu não estava trabalhando em um notebook IPython remoto

Meus palpites educados são:

  • problema com algum soquete em algum lugar ...
  • back-ends de threading matplotlib estão atrapalhando <-- mas isso é só porque eles quase sempre fazem isso, então é melhor colocar lá a aposta;)

Quando o problema ocorre, eu apenas reinicio o kernel de dentro da interface da web e refaço o que estava fazendo ...

EDIT: também é difícil para mim reproduzi-lo, mas notei que se eu não usar o BLAS, por exemplo, se não usar o produto escalar do numpy, o problema não aparece, embora eu deva executar mais alguns testes para verificar isso.

Também vejo esse problema com bastante frequência e é difícil de resolver - se houver muitos dados demorados para processar no kernel, pode ser muito doloroso matar tudo e forçar uma reinicialização. Definitivamente não é um bug imaginário :)

Eu também tenho esse problema no OSX + chrome.

@minrk , acho que vale a pena reabrir. Não tenho privs suficientes para reabrir a menos de criar um novo problema.

A partir da CLI, parece que pressionar o botão de parada está fazendo alguma coisa, mas o notebook permanece completamente sem resposta.

[I 15:26:22.224 NotebookApp] Kernel interrupted: edee0497-b340-43fd-be77-1ad67e5170ee
[I 15:26:32.197 NotebookApp] Kernel interrupted: edee0497-b340-43fd-be77-1ad67e5170ee
[I 15:26:42.688 NotebookApp] Saving file at /Untitled.ipynb
[I 15:27:30.993 NotebookApp] Kernel interrupted: edee0497-b340-43fd-be77-1ad67e5170ee
[I 15:27:35.605 NotebookApp] Kernel interrupted: edee0497-b340-43fd-be77-1ad67e5170ee
[I 15:28:43.999 NotebookApp] Saving file at /Untitled.ipynb
[I 15:29:28.038 NotebookApp] Kernel interrupted: edee0497-b340-43fd-be77-1ad67e5170ee

Acho que um de nós precisa encontrar um notebook simples que reproduza esse problema, pelo menos em algum sistema. Caso contrário, provavelmente não será corrigível.

Também estou vendo esse problema.

Acho que um de nós precisa encontrar um notebook simples que reproduza esse problema, pelo menos em algum sistema.

while True:
    print "foo"

Isso faz com que o Firefox use 100% da CPU e não responda de nenhuma forma ou forma. Matar o Firefox e o processo do IPython é a única maneira de recuperar o sistema.

Ipython 3.0.0
Firefox 42.0
Linux 3.13.0-24-genérico

posso reproduzir com
ipython 3.2.0
python 2.7.10
Versão do Chrome 46.0.2490.86 (64 bits)
OSX 10.10.5

Um grande aborrecimento para mim também. Muitas vezes tenho que matar todo o servidor do notebook junto com o chrome por causa desse problema. Eu posso chegar ao ponto em que clico no botão de interrupção do kernel e ele destaca como se tivesse sido clicado, mas algo, em algum lugar, não recebe a mensagem para parar.

Minha impressão inicial é que é um problema com o mecanismo de renderização de texto do Chrome, mas sei pouco sobre como isso funciona.

Outro exemplo de lentidão é quando um matplotlib relativamente grande vem ao primeiro plano depois de rolar para ele. O notebook inteiro fica extremamente agitado por uns bons 4-5 segundos.

Para o que vale a pena, estou usando uma máquina bastante robusta, por isso é especialmente estranho que o jupyter possa deixar minha máquina inteira de joelhos.

9/10, isso acontece por acidente, então não é tão fácil quanto chamar de bug de erro do usuário.

Acabei de ter esse problema ocorrer para mim (ou pelo menos se encaixa no perfil descrito acima). Eu não conseguia que a janela respondesse regularmente, mas _eu poderia_ fazer uma cópia muito lenta da página inteira, o que me permitiu manter minhas alterações de código recentes.

Não uma solução para o problema, mas uma forma potencial de mitigar suas consequências.

Eu tive o mesmo problema hoje e no passado, executando o Linux Mint (18.0) e o firefox. Era um gerador count() muito simples, mas eu estava mexendo com __getitem__ e, de uma forma boba, coloquei um print na chave.

As versões mais recentes de nossos pacotes implementam a limitação de saída, o que deve mitigar os problemas com grandes quantidades de saída que tornam o navegador mais lento.

Fechando, pois esse problema não está no próprio IPython e, se ainda for problemático e relevante, deve ser aberto no repositório correto. Isso permitirá manter o número de problemas abertos no repositório IPython sob controle.

Fique à vontade para continuar comentando ou reabrir se necessário.

Obrigado.

@Carreau , você tem um repositório sugerido (ou isso simplesmente não foi transferido para onde os problemas do notebook são rastreados ...)?

Isso precisará ser migrado para jupyter/notebook ou jupyterlab/jupyterlab. Provavelmente o segundo se afetar também o jupyterlab.

Esta página foi útil?
0 / 5 - 0 avaliações