Ruby,等待回调

时间:2014-12-06 22:10:53

标签: ruby multithreading

我正在使用ruby-mpd库编写mpd客户端。它有回调驱动的事件监听器,但我不知道如何等待回执被执行.o

require 'ruby-mpd'

puts "started new thread"
mpd = MPD.new('localhost', '6600', callbacks: true)

# MPD#connect and MPD#disconnect fire the `:connection` event.
mpd.on(:connection) do |connection|
  if connection
    puts 'connected...'
  else
    puts 'disconnected'
  end
end

mpd.connect

如果我在IRB中逐行运行connected将在mpd.connect之后打印,但是如果我将其作为脚本运行,它会在调用connect之后立即退出(在回调被调用之前?) 在文件末尾添加sleep电话也无济于事。

如何让这个脚本永远不会退出并等待来自用户的终止信号?

好的,我看了一下ruby-mpd如何实现回调。它产生一个循环遍历更新状态对象的块的线程。如果对象发生更改,则会发出事件。

我认为我的初始示例错过了connection属性的更改,因此甚至从未被解雇过。

require 'ruby-mpd'

mpd = MPD.new('localhost', '6600', callbacks: true)

mpd.on(:connection) do
  puts 'connected...'
end

mpd.on(:state) do |state|
  puts state
end

mpd.on(:time) do |elapsed_time, total|
  puts "#{elapsed_time}/#{total}"
end

mpd.connect

while true; end

1 个答案:

答案 0 :(得分:1)

你可以在一个eventmachine块中包装mpd调用,这将处理while true; end循环并且不会浪费cpu周期。您还可以免费获得所有事件处理I / O,延迟和定时器逻辑吗?

100%未经测试的代码,但它会是这样的:

require 'ruby-mpd'

EventMachine.run do

  mpd = MPD.new('localhost', '6600', callbacks: true)

  mpd.on(:connection) do
    puts 'connected...'
  end

  mpd.on(:state) do |state|
    puts state
  end

  mpd.on(:time) do |elapsed_time, total|
    puts "#{elapsed_time}/#{total}"
  end

  mpd.connect

end