【问题标题】:Spawning an independent thread or process in Ruby在 Ruby 中产生一个独立的线程或进程
【发布时间】:2011-08-01 09:44:09
【问题描述】:

我可能在错误的方向上解决这个问题,所以任何帮助将不胜感激。

我有一个 Ruby 脚本,除其他外,它启动一个可执行文件。我想启动这个可执行文件——目前正在使用系统“”触发——然后继续执行脚本。当脚本完成时,我希望它退出但让可执行文件保持运行。

原来我有以下

# Do some work
# Start the executable
system("executable_to_run.exe")

# Continue working

但是executable_to_run.exe是一个阻塞的可执行文件,系统“”在可执行文件完成运行之前不会退出(我不希望它这样做)

所以我现在有这样的东西(大幅减少)

# Do some work
# Start the executable on it's one thread
Thread.new do
  system("executable_to_run.exe")
end

# Continue working

这很有效,因为我的脚本可以在线程在后台运行可执行文件时继续运行。不幸的是,当我的脚本退出时,可执行线程仍在运行,并且在线程可以退出之前它不会退出。如果我杀死可执行文件,线程退出并且脚本退出。

所以我需要做的是触发“executable_to_run.exe”并让它在后台运行。

我在 Windows 上使用 Ruby 1.8.7,这意味着未实现 fork。我无法升级到 1.9,因为我需要首先解决内部和外部团队依赖项(而且不会很快完成)。

我试过了

  • 通过“开始”运行进程 命令,但这仍然会阻塞
  • 在可执行线程上调用 Thread.kill 但它仍然需要可执行文件 被杀

那么这是我可以在 Ruby 中做的事情,我只是错过了一些东西,还是因为我不能使用 Fork 而遇到问题?

提前致谢

【问题讨论】:

  • 如果 system("start executable_to_run.exe") 阻塞,有些事情搞砸了。 start 的要点之一是它启动了一个新的、独立的进程。
  • Ruby 1.8.7 不支持 Windows 上的本机线程,因为 Windows 选择不正确实现 POSIX 线程。你知道这一点。完成这项工作的唯一方法是说服 Windows 在 system 调用中启动一个独立进程。你需要一个 Windows 而不是一个 Ruby 人来回答这个问题。

标签: ruby windows ruby-1.8


【解决方案1】:

detunized 的答案应该适用于 Windows。这是跨平台的:

pid = spawn 'some_executable'
Process.detach(pid) #tell the OS we're not interested in the exit status

【讨论】:

  • 我的印象是 spawn 是 1.9+ 并且在 1.8.7 上不可用?使用“spawn”时,我肯定会遇到未定义的方法错误。
【解决方案2】:

我刚刚尝试过,start 在 Ruby 1.8.7 的 Windows 7 x64 上不会阻塞。

system 'start notepad'
puts 'Exiting now...'

这显然是特定于 Windows 的。

【讨论】:

  • 它是特定于可执行文件的。例如,在命令提示符下运行记事本不会保留该进程。记事本启动,但命令提示符可用于更多命令。但是在命令提示符下运行我想运行的可执行文件确实会保留该进程。
  • @Lee Winder - 是否有另一个可执行文件可以演示这种行为,我们可以用它来测试它吗?因为到目前为止,我所尝试的一切都与 start program 一起工作。
猜你喜欢
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2014-01-05
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
相关资源
最近更新 更多