我有一个小的HTTP服务器脚本,我使用eventmachine编写,需要调用外部脚本/命令,并通过反引号(``
)来完成。当提供没有运行反向代码的请求时,一切都很好,但是,只要我的EM代码执行任何反向添加的外部脚本,它就会停止提供请求并停止执行。
我注意到eventmachine似乎对子进程和/或线程敏感,并且似乎有popen
方法用于此目的,但EM的源警告此方法在Windows下不起作用。许多运行此脚本的计算机都在运行Windows,因此我无法使用popen
。
我在这里运气不好吗?有没有一种安全的方法从Windows下的eventmachine脚本运行外部命令?有没有办法可以在没有阻止EM执行的情况下触发一些外部命令?
编辑:最让我搞砸EM的罪魁祸首就是我对Windows start
命令的使用,如:start java myclass
。我使用start的原因是因为我希望这些外部脚本在提供EM请求后开始运行并继续运行
答案 0 :(得分:1)
ruby documentation表示反引号运算符“返回子shell中运行cmd的标准输出”
因此,如果你的命令,即启动java myclass继续运行,那么ruby正在等待它完成将它的输出传回给你的程序。
答案 1 :(得分:1)
尝试win32-open3(如果它需要跨平台而不是仅限Windows,请查看POpen4)
答案 2 :(得分:0)
EventMachine有一个线程池。你可以EM.defer
这样的反对
EM.defer { `start java myclass` }
默认情况下,线程池有20个线程,您可以通过为EM.threadpool_size
赋值来更改其大小。
重要的是要注意,EM.defer
可以传递操作,这是在延迟线程中执行的,在反应器线程中执行的回调,以及在操作引发异常时在reactor线程中运行的错误回调。
如果你使用Java,你可以考虑使用jruby,它有真正的线程支持,你可以在jruby中重用你的Java代码。