• 1 Post
  • 7 Comments
Joined 9 months ago
cake
Cake day: March 1st, 2024

help-circle
  • I can’t remember if threads are core bound or not.

    On Linux, by default they’re not. getcpu(2) says:

       The getcpu() system call identifies the processor and node on which the
       calling thread or process is currently running and writes them into the
       integers pointed to by the cpu and node arguments.  ...
    
       The  information  placed in cpu is guaranteed to be current only at the
       time of the  call:  unless  the  CPU  affinity  has  been  fixed  using
       sched_setaffinity(2),  the  kernel  might  change  the CPU at any time.
       (Normally this does not happen because the scheduler tries to  minimize
       movements  between  CPUs  to keep caches hot, but it is possible.)  The
       caller must allow for the possibility that the information returned  in
       cpu and node is no longer current by the time the call returns.
    


  • I’m using pylsp (python-language-server). My reason being a process of elimination. I also use mypy for type-checking, so even without considering the danger of allowing MS to entrench itself into my tooling, it didn’t make much sense to use a tool built around pyright.

    The ruff-lsp seems to only do the things that ruff is good at: linting, code formatting, auto-fix of certain issues, and I wanted more.

    Since I saw that pylsp uses Jedi under the hood, and offered a mypy plugin, I felt that pylsp offer a superset of the features that the Jedi LSP has. In the end I’m happy with pylsp, and never tried Jedi LSP.

    However: with the mypy plugin for pylsp, the memory usage kept growing to ridiculous amounts and getting killed, so I ended up disabling it. I had a look in their bug tracker Instead, I’m using flymake that triggers mypy on save, and that seems to work well. (I have a few changes on top of com4/flymake-mypy.el, because it leaves behind plenty of temporary files.)

    That offers me:

    • jump to definition (using Jedi under the hood)
    • rename symbol (and then Jedi goes and rename uses of that symbol)
    • smart completion (eg. offers only variables in scope, or after a . only the instance members, etc.)
    • short documentation on hover
    • squiggly lines for errors found by flake8 or mypy
    • and a few more that I don’t really notice

    One thing I struggled with: where do you install the LSP? Using pipx for a user installation, or in a per-project venv? I did the latter, which works for me because I work on a small number of projects. That also means that mypy finds all the relevant third-party libraries in that venv. I wrote a bit of elisp that allow emacs to find the right mypy binary to check code.