gpt4 book ai didi

ruby - fork WEBrick 并等待开始

转载 作者:数据小太阳 更新时间:2023-10-29 07:15:19 26 4
gpt4 key购买 nike

我有以下代码,其中 fork 了一个 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 有一些未记录的回调 Hook (可悲的是,事实上,整个 webrick 库的记录很差!),例如 :StartCallback , :StopCallback , :AcceptCallback .您可以在初始化 WEBRick::HTTPServer 实例时提供 Hook 。

因此,结合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

关于ruby - fork WEBrick 并等待开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15617347/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com