2012-12-22 47 views
3

如果您使用+ ruby​​編譯Vim的最新版本,則可以在Vim中使用:ruby命令。異步Ruby如何在Vim中工作?

當我運行一些異步Ruby代碼時,'引擎蓋下'發生了什麼?

例如:

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

:ruby print 'foo' 
# world 
# foo 

這立即打印 '你好',符合市場預期。但是,直到我運行另一個:ruby命令時纔會打印「world」。 Vim是否僅支持一個線程,並將新線程推送到某種隊列上以便在下一個運行:ruby命令?

我試過在Vim的源代碼中尋找src/if_ruby.c,但是我的Ruby C-Extension閱讀技能並不是最好的。

我在問,因爲我想寫一些Ruby,每隔幾秒輪詢一次並更新一個Vim窗口。

+2

是的,Vim是單線程的。有一些異步庫([this one])(http://www.vim.org/scripts/script.php?script_id=3307),[this one](https://github.com/rygwdn/vim-異步),可能還有其他...),您可能會感興趣。 – romainl

回答

3

Vim本身是單線程的。但有一些例外或解決方法:

  1. Python線程正在工作,但由於某種原因,不在ARM上。我不能說,但我可以預測,如果從非主線程運行vim.*方法會發生什麼情況。我看到它在一些插件中使用,但沒有線程中的vim.*
  2. Python多處理模塊工作正常(儘管您希望禁用所有vim信號處理程序)。我個人在我的aurum插件中使用這個解決方案。我猜ruby相當於可以工作,但AFAIR它只是一個簡單的字節管道調用fork()作爲唯一的通信,沒有像multiprocessing.Pipe(通過有限的一組python對象的管道),multiprocessing.Queue(圍繞實現對象的管道的包裝隊列),multiprocessing.Value(共享內存存儲固定大小的值與對象接口)或multiprocessing.Lock(不知道它是什麼,但名稱自己說明目的)。至少不在標準庫或核心中。

AFAIK一些舊的ruby版本使用綠色線程,因此(從操作系統的角度來看)是單線程的,而新的ruby現在使用POSIX線程。你可以嘗試更新,也許這將工作。儘管你最好選擇其他的東西作爲測試(比如在一個單獨的線程中修改某個變量),而不是調用vim的東西。你可以在用戶系統上找到的任何當前python版本都使用POSIX線程,這可能是ruby線程在Python中不工作的原因的根源。