eventchchine和外部脚本通过反引号

时间:2010-02-08 20:21:40

标签: windows ruby external-process eventmachine

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

我注意到eventmachine似乎对子进程和/或线程敏感,并且似乎有popen方法用于此目的,但EM的源警告此方法在Windows下不起作用。许多运行此脚本的计算机都在运行Windows,因此我无法使用popen

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

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

3 个答案:

答案 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代码。