2010-02-08 44 views
4

我有一個小型的HTTP服務器腳本,我寫了使用eventmachine需要調用外部腳本/命令,並通過反引號(``)。當提供不運行反撥代碼的請求時,一切都很好,但是,只要我的EM代碼執行任何反向外部腳本,它就會停止服務請求並一般停止執行。eventmachine和外部腳本通過反引號

我注意到eventmachine似乎對子進程和/或線程很敏感,並且似乎有用於此目的的popen方法,但EM的源警告說此方法在Windows下不起作用。運行這個腳本的許多機器都運行Windows,所以我不能使用popen

我在這裏運氣不好嗎?有沒有一種安全的方式來從Windows下的eventmachine腳本運行外部命令?有什麼辦法可以觸發一些命令在外部運行而不阻塞EM的執行?

編輯:,這似乎是搞砸了EM最多的是我在Windows start命令的用法,如罪魁禍首:start java myclass。我使用的是開始的原因是因爲我想這些外部腳本開始運行,並保持運行EM請求送達

回答

1

ruby documentation指出,反引號操作符「返回運行CMD在子shell標準輸出」後

所以,如果你的命令即啓動java myclass繼續運行,那麼ruby正在等待它完成將它的輸出傳回給你的程序。

0

EventMachine的有一個線程池。您可以EM.defer你的反引號這樣

EM.defer { `start java myclass` } 

默認情況下,線程池有20個線程,並且可以通過assiging EM.threadpool_size值改變其大小。

需要注意的是,EM.defer可以傳遞操作,該操作在延遲線程中執行,在反應器線程中執行的回調以及在操作引發異常時在反應器線程中運行的錯誤回調。

如果你使用Java,你可以考慮使用jruby,它有真正的線程支持,你可能可以在jruby中重用你的Java代碼。