按住任意键时IPython崩溃

时间:2019-05-30 14:25:36

标签: pthreads ipython python-multithreading ulimit

当我进入特定的远程计算机并启动IPython会话时,每当我按住某个键约半秒钟(例如,退格键)时,它就会崩溃。

错误输出粘贴在下面:

  File "/home/zach/local/anaconda3/bin/ipython", line 11, in <module>
    sys.exit(start_ipython())
  File "/home/zach/local/anaconda3/lib/python3.7/site-packages/IPython/__init__.py", line 125, in start_ipython
    return launch_new_instance(argv=argv, **kwargs)
  File "/home/zach/local/anaconda3/lib/python3.7/site-packages/traitlets/config/application.py", line 658, in launch_instance
    app.start()
  File "/home/zach/local/anaconda3/lib/python3.7/site-packages/IPython/terminal/ipapp.py", line 356, in start
    self.shell.mainloop()
  File "/home/zach/local/anaconda3/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", line 498, in mainloop
    self.interact()
  File "/home/zach/local/anaconda3/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", line 481, in interact
    code = self.prompt_for_code()
  File "/home/zach/local/anaconda3/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", line 410, in prompt_for_code
    **self._extra_prompt_options())
  File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/shortcuts/prompt.py", line 738, in prompt
    return run_sync()
  File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/shortcuts/prompt.py", line 727, in run_sync
    return self.app.run(inputhook=self.inputhook, pre_run=pre_run2)
  File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/application/application.py", line 709, in run
    return run()
  File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/application/application.py", line 682, in run
    run_until_complete(f, inputhook=inputhook)
  File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/eventloop/defaults.py", line 123, in run_until_complete
    return get_event_loop().run_until_complete(future, inputhook=inputhook)
  File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/eventloop/posix.py", line 66, in run_until_complete
    self._run_once(inputhook)
  File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/eventloop/posix.py", line 85, in _run_once
    self._inputhook_context.call_inputhook(ready, inputhook)
  File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/eventloop/inputhook.py", line 78, in call_inputhook
    threading.Thread(target=thread).start()
  File "/home/zach/local/anaconda3/lib/python3.7/threading.py", line 847, in start
    _start_new_thread(self._bootstrap, ())
RuntimeError: can't start new thread

If you suspect this is an IPython bug, please report it at:
    https://github.com/ipython/ipython/issues
or send an email to the mailing list at ipython-dev@python.org

You can print a more detailed traceback right now with "%tb", or use "%debug"
to interactively debug it.

Extra-detailed tracebacks for bug-reporting purposes can be enabled via:
    %config Application.verbose_crash=True

它使我从这里进入一个破碎的bash会话,尽管我可以执行ls,man,pwd,ipython等命令,但我的键盘按键未显示在屏幕上。我只能通过按Control D来终止bash会话。紧接着是ControlC。特别是,该消息建议我按%tb等是不可能的。

其他程序不竞争线程。仔细检查错误,似乎事件循环可能正在尝试创建一个线程来处理每次按键操作,这最终导致分配更多线程失败。尽管这确实是预期的行为,但这似乎是一个牵强的问题。

这似乎与问题https://ipython.org/faq.html#ipython-crashes-under-os-x-when-using-the-arrow-keys类似。

这似乎本身并不是Python问题,因为如果我使用Python而不是IPython,问题就会消失。我最初使用Anaconda ipython,但也切换到/ usr / bin / ipython中的系统ipython,结果相同。还尝试了全新安装的Anaconda,具有相同的问题。还尝试在具有相同操作系统的另一台计算机上全新安装Anaconda,并且没有发生此问题。

我正在寻找可以在此问题上取得进展的想法。任何想法都将受到赞赏,如有需要,我将发布后续数据。

Python 3.7.3(默认,2019年3月27日,22:11:17) IPython 7.5.0 Ubuntu 18.04.2 LTS

1 个答案:

答案 0 :(得分:0)

现在已修复,但对我来说仍然有些神秘。我一直跟踪堆栈,一直到CPython一直到pthreads库调用。 pthreads文档指出,只有在堆内存不足或已分配最大线程数的情况下,该错误基本上才可能发生。我使用ulimit将每个进程的虚拟内存设置为无限制(大约3 GB)。这解决了问题。

因此,显然,虚拟内存限制会干扰分配线程的能力。显而易见的解决方案是需要更多的内存,尽管很难相信需要3 GB以上才能响应按键。另一种可能性是,每个线程分配的数量是虚拟内存限制的函数-我记得pthreads文档中的类似内容,尽管它有点超出我的头了。