ruby - EventMachine DeferrableChildProcess 错误处理

标签 ruby eventmachine child-process

我在使 EventMachine::DeferrableChildProcess.open 实际上执行任何类型的错误处理时遇到问题。希望我做错了。这是一个例子:

require "eventmachine"
EM.run do
  cp = EM::DeferrableChildProcess.open("ls /trololo")
  cp.callback { |data| puts "Received some data: '#{data}'" }
  cp.errback { |err| puts "Failed: #{err.inspect}" }
end

我希望这段代码的结果(假设您的系统上实际上没有 /trolol 目录)是:“失败:”。相反,我得到“收到一些数据:''”。雪上加霜的是,由 ls 引起的错误消息(“ls:无法访问/trololo:没有这样的文件或目录”)以某种方式打印到 stderr。

是我做错了什么,还是 EM::DeferrableChildProcess.open 中基本上没有错误处理?我用 EM.popen 得到了类似的结果。

最佳答案

好的,看看 EventMachine 的实现,我可以清楚地看到 DeferrableChildProcess 只是假设成功 - errback 永远不会被调用。我想这样做的目的是您在自己的回调中必须执行 get_status 来弄清楚发生了什么。我不关心那个 API,所以我写了一个错误处理 DeferrableChildProcess:

class DeferrableChildProcess < EventMachine::Connection
  include EventMachine::Deferrable

  def initialize
    super
    @data = []
  end

  def self.open cmd
    EventMachine.popen(cmd, DeferrableChildProcess)
  end

  def receive_data data
    @data << data
  end

  def unbind
    status = get_status
    if status.exitstatus != 0
      fail(status)
    else
      succeed(@data.join, status)
    end
  end
end

关于ruby - EventMachine DeferrableChildProcess 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12090635/

相关文章:

node.js - Node 子进程 exec async 仅调用一次

ruby-on-rails - Thinking Sphinx - 与 bool 字段的嵌套关联

ruby - Sinatra Synchrony 与 Redis 连接池

c - 为什么子运行时出现负数?

ruby - 想了解 EM-Synchrony 、em-http-request 和 Fiber 之间的关系吗?

ruby-on-rails - Ruby - 向 Websocket 发送消息

c - 没有子进程的痕迹

ruby-on-rails - 从表中删除与数组中的数据匹配的记录?

ruby-on-rails - Rails 3. 为什么我的十进制值行是诸如#<BigDecimal :5003750 ,'0.1E2' , 9(18)>> 之类的值?

ruby-on-rails - rails : How to make Date strftime aware of the default locale?