【问题标题】:Spawning simultaneous child processes in Ruby在 Ruby 中同时生成子进程
【发布时间】:2012-07-18 02:18:04
【问题描述】:

我正在使用 resque,它带有一个队列处理器,作为其执行的一部分,它将启动一个 shell 进程。目前,我使用PTY.spawn() 调用shell 命令并处理其输出。

我想扩充这段代码,以便可以给出一个数量 (N)(在 VM 上执行的命令,我希望能够通过一次调用启动一个可变数字),并调用 shell 进程N 次在不同的进程中,第 N 次调用不必等待调用 N-1 完成,依此类推。我还想从每次调用中捕获所有 STDOUT,以便在调用完成后对输出进行处理。

我查看了Kernel::fork,但分叉块内的代码范围与其父块不同(原因很明显)。

我可以使用哪些工具来独立生成每个进程,捕获它们的输出,并且我仍然可以让父进程等待它们全部完成后再继续?

【问题讨论】:

    标签: ruby resque


    【解决方案1】:

    这里:

    stdouts=[]
    numberOfProcesses.times do 
      stdouts<<PTY.spawn(command_line)[0..-1]
    end
    

    如果您只是生成它们并获得一堆 STDOUT/STDIN 对,那就很基本了。如果您希望能够在每个进程的输出完成后立即对其进行处理,请尝试以下操作:

    threads=[]
    numberOfProcesses.times do
      threads<<Thread.new(command_line) |cmd|
        stdout, stdin, pid = PTY.spawn(cmd)
        Process.waitpid(pid)
        process_output(stdout.read)
      end
    end
    threads.each {|t| t.join}
    

    这会并行生成它们,每个线程都在等待它的实例完成。当它的实例完成时,它处理输出并返回。主线程等待所有其他线程完成。

    【讨论】:

    • 你能澄清一下吗?调用 Thread.new 或 t.join 时线程是否开始处理?
    • @asfallows:Thread.newt.join 等待线程完成。
    • 谢谢!我会玩这个。应该正是我所需要的。
    • @asfallows:很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2013-01-16
    • 2016-11-05
    • 2011-01-31
    • 1970-01-01
    • 2023-03-10
    • 2012-06-09
    相关资源
    最近更新 更多