加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – Fork WEBrick并等待开始

发布时间:2020-12-17 03:22:54 所属栏目:百科 来源:网络整理
导读:我有以下代码,其中WEBrick实例是分叉的,我想等到webrick启动,然后继续其余的代码: require 'webrick'pid = fork do server = WEBrick::HTTPServer.new({:Port = 3333,:BindAddress = "localhost"}) trap("INT") { server.shutdown } sleep 10 # here is cod
我有以下代码,其中WEBrick实例是分叉的,我想等到webrick启动,然后继续其余的代码:

require 'webrick'

pid = fork do
  server = WEBrick::HTTPServer.new({:Port => 3333,:BindAddress => "localhost"})
  trap("INT") { server.shutdown }
  sleep 10 # here is code that take some time to setup
  server.start
end
# here I want to wait till the fork is complete or the WEBrick server is started and accepts connections
puts `curl localhost:3333 --max-time 1` # then I can talk to the webrick
Process.kill('INT',pid) # finally the webrick should be killed

那么我怎么能等到fork完成,甚至更好,直到WEBrick准备好接受连接?我发现了一段代码,它们处理IO.pipe,读者和作者.但这并不等待webrick加载.

不幸的是,我没有找到任何针对这个具体案例希望有人能提供帮助.

解决方法

WEBRick :: GenericServer有一些未记录的回调钩子(遗憾的是,事实上,整个webrick库记录很少!),例如 :StartCallback,:StopCallback,:AcceptCallback.您可以在初始化WEBRick :: HTTPServer实例时提供钩子.

因此,结合IO.pipe,您可以编写如下代码:

require 'webrick'

PORT = 3333

rd,wt = IO.pipe

pid = fork do
  rd.close
  server = WEBrick::HTTPServer.new({
    :Port => PORT,:BindAddress => "localhost",:StartCallback => Proc.new {
      wt.write(1)  # write "1",signal a server start message
      wt.close
    }
  })
  trap("INT") { server.shutdown }
  server.start
end

wt.close
rd.read(1)  # read a byte for the server start signal
rd.close

puts `curl localhost:#{PORT} --max-time 1` # then I can talk to the webrick
Process.kill('INT',pid) # finally the webrick should be killed

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读