jedi fork大量python进程

今天发现emacs fork出了大量python子进程(500+),占用内存和进程号(kill掉之后内存使用减少了将近4G)。有没有人遇到过类似的情况?

使用的是emacs --daemon模式,pyls为在~/.emacs.d/.python-environments/default下安装的python-language-server[all],初步判断是lsp-python的问题,之前用elpy从来没有出现这这种情况。

各种版本信息如下:

  • macOS 10.13.6
  • Emacs 26.1-2 (Homebrew Cask)
  • company-20180913.2311
  • company-jedi-20151217.321
  • company-lsp-20180917.2244
  • lsp-python-20180816.1314
  • lsp-ui-20181007.2219
  • pipenv-20180719.547
  • jedi-core-20170121.1410

%E5%9B%BE%E7%89%87

修正:应该是jedi一直在后台fork subprocess。ps -elf输出进程command为/path/to/jedi/evaluate/compiled/subprocess/__main__.py /path/to/site-packages 4

刚试了下,我也是这样

我用lsp-python 体验比较差,

  1. 经常会有冗余的旁侧信息跳出来干扰注意力.
  2. 我无法用virtual env, 不清楚怎么回事…

python, 我基本用spacemacs默认的anaconda, 刚刚够用, 也比较省心.

我用的elpy 只要内存够jedi就无线fork 经常把电脑吃死了,现在用用就退从新进,要不内存永远不够

查到了一种解决方案,源于jedi@github#1242,可以在一定程度上缓解此问题,但是运行较长时间后还会产生几十个进程,不过比之前的数百要好很多了。

目前此issue仍为open状态,所以我参照里面的建议手动打了个patch:

# ~/.emacs.d/.python-environments/default/lib/python3.7/site-packages/jedi/api/environment.py
192a193
>     var = os.environ.get('VIRTUAL_ENV')
194c195,196
<     if environment.path != os.environ.get('VIRTUAL_ENV'):
---
>     # if environment.path != os.environ.get('VIRTUAL_ENV'):
>     if var and var != environment.path:

“冗余的旁侧信息”应该指的是lsp-ui-mode吧,我用了一段时间之后也觉得太烦人,就把它关了。

elpy也那样。。

elpy底层也是jedi

(setq lsp-ui-sideline-enable nil)
1 个赞