gpt4 book ai didi

ruby - 异步 Ruby 如何在 Vim 中工作?

转载 作者:数据小太阳 更新时间:2023-10-29 08:00:47 26 4
gpt4 key购买 nike

如果你用 +ruby 编译最新版本的 Vim,你可以在 Vim 中使用 :ruby 命令。

当我运行一些异步 Ruby 代码时,“幕后”发生了什么?

例如:

:ruby <<EOS
print 'hello'
Thread.new do
sleep 1
print 'world'
end
EOS
# hello

:ruby print 'foo'
# world
# foo

如预期的那样,这会立即打印出“hello”。但是,在我运行另一个 :ruby 命令之前,“world”不会打印出来。 Vim 是否只支持一个线程,并将新线程插入某种队列以便在下一个 :ruby 命令上运行?

我已经尝试在 src/if_ruby.c 中查看 Vim 的源代码,但我的 Ruby C-Extension 阅读技巧并不是最好的。

我在问,因为我想编写一些每隔几秒轮询一次并更新 Vim 窗口的 Ruby。

最佳答案

Vim 本身是单线程的。但也有一些异常(exception)或解决方法:

  1. Python 线程正在运行,但出于某种原因不能在 ARM 上运行。我不能说虽然我可以预测如果你从非主线程运行 vim.* 方法会发生什么。我看到它在一些插件中使用,但在线程中没有 vim.*
  2. Python 多处理模块运行良好(尽管您需要禁用所有 vim 信号处理程序)。我个人在我的 aurum 插件中使用这个解决方案。我想 ruby​​ 等效项会起作用,但 AFAIR 它只是一个 fork() 调用,使用简单的字节管道作为唯一的通信,没有什么比 multiprocessing.Pipe (管道传递一组有限的 python 对象),multiprocessing.Queue(实现对象队列的管道包装),multiprocessing.Value(共享内存存储固定大小的值与对象接口(interface))或 multiprocessing.Lock(不知道它是什么,但名称本身就说明了用途)。至少不在标准库或核心中。

据我所知,一些较旧的 ruby​​ 版本使用绿色线程,因此(从操作系统的角度来看)是单线程的,而较新的 ruby​​ 现在正在使用 POSIX 线程。您可以尝试更新,也许这会起作用。虽然你最好选择其他东西作为测试(比如在单独的线程中修改一些变量),而不是调用 vim 的东西。您可以在用户系统上找到的任何当前 python 版本都在使用 POSIX 线程,这可能是 ruby​​ 线程无法工作而 python 线程可以工作的根本原因。

关于ruby - 异步 Ruby 如何在 Vim 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14002334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com