在MRI Ruby中,我可以这样做:

def transfer
  internal_server = self.init_server
  pid = fork do
    internal_server.run
  end

  # Make the server process run independently.
  Process.detach(pid)

  internal_client = self.init_client
  # Do other stuff with connecting to internal_server...
  internal_client.post('some data')
ensure
  # Kill server
  Process.kill('KILL', pid) if pid
end

但是,以上代码无法在jRuby中运行,因为它不支持'fork'方法:
NotImplementedError: fork is not available on this platform

jRuby中是否有其他替代解决方案?

谢谢。

最佳答案

这是一个很好的问题,但是不幸的是,如果您想要启动与父进程共享状态的新进程,那么我不相信JVM可以安全地提供您想要的东西。那是因为分支仅复制当前正在运行的线程。例如,不会复制GC线程。您不想在没有GC的情况下运行JVM。

使用fork的唯一半安全的方法是此后立即执行。

查尔斯·纳特(Charles Nutter)在blog上首先说您可以使用FFI进行派生和执行,但随后提供了一个警告:



我倾向于在这里相信他的建议。

因此,fork和exec会带来一些风险,但是保持 fork 的JVM会带来麻烦。

您应该认真考虑塞尔吉奥评论中建议的替代方案。

关于ruby - 在jRuby中使用 'fork'生成进程的替代方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11818463/

10-16 19:21