4

我有一个使用 eventmachine 编写的小型 HTTP 服务器脚本,它需要调用外部脚本/命令,并通过反引号 ( ``) 来实现。当提供不运行反引号代码的请求时,一切都很好,但是,只要我的 EM 代码执行任何反引号的外部脚本,它就会停止提供请求并停止执行。

我注意到 eventmachine 似乎对子进程和/或线程很敏感,并且似乎有用popen于此目的的方法,但 EM 的消息来源警告说此方法在 Windows 下不起作用。很多运行这个脚本的机器都在运行 Windows,所以我不能使用popen.

我在这里运气不好?是否有一种安全的方法可以从 Windows 下的 eventmachine 脚本运行外部命令?有什么办法可以在不阻止 EM 执行的情况下触发一些在外部运行的命令?

编辑:似乎把 EM 搞砸的罪魁祸首是我对 Windowsstart命令的使用,如:start java myclass. 我使用 start 的原因是因为我希望这些外部脚本开始运行并在提供 EM 请求后继续运行

4

3 回答 3

1

试试win32-open3(如果它需要跨平台而不是仅限 Windows,也看看POpen4

于 2010-04-11T13:41:23.287 回答
1

ruby 文档指出,反引号运算符“返回在子外壳中运行 cmd 的标准输出”

因此,如果您的命令,即 start java myclass 继续运行,那么 ruby​​ 正在等待它完成将其输出传递回您的程序。

于 2010-03-22T23:56:31.647 回答
0

EventMachine 有一个线程池。你可以EM.defer像这样反引号

EM.defer { `start java myclass` }

默认情况下,线程池有 20 个线程,您可以通过分配EM.threadpool_size一个值来更改其大小。

需要注意的是,EM.defer可以传递在延迟线程中执行的操作,在反应器线程中执行的回调,以及在操作引发异常时在反应器线程中运行的错误回调。

如果你使用 Java,你可以考虑使用 jruby,它有真正的线程支持,你可以在 jruby 中重用你的 Java 代码。

于 2015-11-26T23:25:43.773 回答