相当于ruby中fork-do for windows机器



我有一个ruby脚本,它派生了一些代码,以便在后台运行并退出命令行。

代码:

fork do
#Example background code
x = 0
while x < 100 do
File.write("./example_file.txt", x.to_s, Mode: "a")
end
end

我希望在windows系统上运行相同的脚本,而不需要额外的gem/库。我看过spawn((,但无法满足我的需求。

fork和Windows在一起并不是很好。Unix和Windows中处理程序的理念非常不同。

在Unix中,进程是功能分解的主要机制。也就是说,在Unix中,一个应用程序或服务将被组成多个协作进程的管道。进程在Unix中的使用方式与对象在Ruby中的使用方法类似。为了实现这一点,流程是廉价轻量级

在Windows中,组件是功能分解的主要机制。即,在Windows中,应用程序或服务将由单个进程组成,使用多个组件实现组件像Ruby中的对象或Unix中的进程一样使用。这意味着Windows中的进程不需要廉价或轻量级,事实上,它们非常昂贵、沉重,而且创建和销毁速度很慢。

除了使用非常不同且更昂贵的流程外,它们与的交互也非常不同。用于创建、管理和销毁流程的API非常不同。在Windows中没有完全等同于fork的东西,也没有简单、高效的方法来实现它

不幸的是,使用TruffleRuby或JRuby也无济于事:虽然TruffleRuby和JRuby的Windows支持传统上甚至比YARV更好,但这并不适用于fork,因为JVM不允许:JVM上的forking创建了一个只有主线程的fork,但没有GC、编译器、I/O或其他辅助线程,这会给您留下一个破碎的JVM。只有当您立即exec一个不同的进程,从而退出JVM时,它才真正起作用。

话虽如此,Kernel#fork的这种特定用法可能可以在JRuby上实现,因为(如果我没记错的话(,您可以在同一JVM中实例化多个JRuby实例。因此,对于这种特殊的用法,您只在后台执行一些Ruby代码,实际上不需要fork,您可以在不同的线程中启动一个新的JRuby实例。

但据我所知,这并没有得到实施。(不过,第一次投稿可能会成为一个有趣的项目!(

与在Windows中使用Kernel#spawn的代码最接近的等价物可能是:

spawn(RbConfig.ruby, '-e' << <<~BLOCK_END)
#Example background code
x = 0
while x < 100 do
File.write("./example_file.txt", x.to_s, Mode: "a")
end
BLOCK_END

但这不是解决问题的正确方法。您将此视为X/Y问题:您有问题X。您知道Unix中的解决方案是Y。现在,与其问";我如何在Windows上解决问题X";,你在问";我如何在Windows上实现解决方案Y";,甚至不必质疑Y是否是正确的解决方案。

因此,您的问题不应该是什么等效于Windows中的fork,而是如何在Windows中设计应用程序。

相关内容

最新更新