在薄轨上安全地停止 em-websocket

Posted

技术标签:

【中文标题】在薄轨上安全地停止 em-websocket【英文标题】:Safely stopping em-websocket in rails on thin 【发布时间】:2012-04-30 13:05:49 【问题描述】:

我有一个在瘦服务器上运行的 Rails 应用程序,以利用 EventMachine 运行循环。问题是我希望能够包含 em-websocket 来处理来自 ws 的信息,并在不停止 EM 运行循环的情况下停止和启动 websocket。这就是我启动 websocket 的方式。

EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
  ws.onopen  
  ws.onclose  
  ws.onmessage  |msg| 
end

问题出在启动/停止代码中。来自 em-websocket 的文档

#Start WebSocket
def self.start(options, &blk)
  EM.epoll
  EM.run do

    trap("TERM")  stop 
    trap("INT")   stop 

    EventMachine::start_server(options[:host], options[:port],
      EventMachine::WebSocket::Connection, options) do |c|
      blk.call(c)
    end
  end
end


#Stop WebSocket
def self.stop
  puts "Terminating WebSocket Server"
  EventMachine.stop
end

问题是内部 em-websocket 代码不跟踪来自 EM:start_server 的签名,以便能够调用 EventMachine::stop_server(signature) 来关闭它。有没有一种方法可以在不修改 em-websocket 的情况下覆盖这些功能,以便我可以安全地启动/停止这些 websocket?我希望它的性能更像标准的 Eventmachine 服务器。

【问题讨论】:

【参考方案1】:

在我看来,您不需要使用 EM::Websocket.start()。而是编写自己的启动/停止代码,然后您可以自己管理签名。

# start a ws server and return the signature
# caller is responsible for +trap+ing to stop it later using said signature.
def start_ws_server(options, &blk)
  return EventMachine::start_server(options[:host], options[:port],
    EventMachine::WebSocket::Connection, options) do |c|
    blk.call(c)
  end
end

# stop a previously started ws server
def stop_ws_server(signature)
  EventMachine::stop_server signature
end

所以现在您可以开始和捕获签名,并在以后使用它来停止它。 start 方法中没有陷阱代码,因为此时签名是未知的。由于您是在方法之外捕获信号,因此您也可以在外部捕获信号并在那里使用存储的信号。

【讨论】:

这就是我最终要做的。

以上是关于在薄轨上安全地停止 em-websocket的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中安全地停止线程? [复制]

如何安全地停止我的“类实现 Runnable”?

Docker 那些事儿如何安全地停止删除容器

如何使用 Multipeer Connectivity 安全地停止发送图像

Docker 那些事儿:如何安全地停止删除容器?

正确安全地停止SpringBoot应用服务