gpt4 book ai didi

ruby - 我如何通过代码守护 ruby​​ 服务器?

转载 作者:行者123 更新时间:2023-12-04 04:12:52 24 4
gpt4 key购买 nike

handler = Rack::Handler::Thin
#driver = Selenium::WebDriver.for :firefox

class RackApp
def call(env)
req = Rack::Request.new(env)
case req.path_info
when /hello/
[200, {"Content-Type" => "text/html"}, [render_erb]]
when /goodbye/
[500, {"Content-Type" => "text/html"}, ["Goodbye Cruel World!"]]
else
[404, {"Content-Type" => "text/html"}, ["I'm Lost!"]]
end
end

def render_erb
raw = File.read('template/tipsters.html.erb')
ERB.new(raw).result(binding)
end
end
handler.run(RackApp.new, {server: 'sfsefsfsef', daemonize: true, pid: "/piddycent.pid"})

puts "hellllllllllllllllllllllllllllllllllllllllllo"

我正在尝试为我的电脑创建一个在浏览器中输出图表的简单应用程序。在瘦服务器被妖魔化后,我正在尝试使用 selenium 导航到本地主机。不幸的是,它不会去守护进程,并且“helllllllllllllllllllllo”仅在我从终端取消进程时打印到终端,也就是说瘦服务器没有被守护进程。

问题是选项散列似乎被忽略了。

是的,任何关于为什么 handler.run 忽略我的选项散列的输入都值得赞赏。完全没有错误,它只是忽略了我的选项散列。

根据文档 https://www.rubydoc.info/gems/rack/Rack/Server守护进程是一个选项吗?

最佳答案

我认为这里的问题与误解有关。当我们谈论 daemonizing a process我们实质上是在说“这个进程现在将独立于任何其他进程在后台运行。”例如,这可以通过 fork 一个进程来创建一个新进程来实现。

这听起来像是你打算在这里做的:启动你的 Ruby 应用程序,它启动一个新的 Rack 应用程序,它 fork 到一个单独的进程中,然后将控制权返回给你的 Ruby 应用程序,这样你现在就有了你的 Rack 应用程序和你的Ruby 应用程序同时运行,因此您可以使用 Selenium 浏览您的 Rack 应用程序。

这不会自动发生。如果您使用 command line 启动您的应用程序,则可以访问 Thin 中的守护进程选项。 . (因为你正在开始一个新过程)但是 there is no automatic process forking ,可能是因为这会导致许多令人困惑的问题。 (即,如果您运行您的应用程序一次并在端口 3000 上 fork 一个新的瘦服务器,然后您的 Ruby 应用程序终止并且您尝试再次运行它,您将已经有一个 fork 的瘦服务器在端口 3000 上运行并尝试启动一个新的会导致错误,因为端口 3000 正在使用中)

本质上,如果您想运行一个守护进程的瘦服务器,然后使用 thin CLI 启动它。如果您想在另一个应用程序中运行临时瘦服务器,请按照上述方式启动它。

这似乎引出了真正的答案:您的解释和代码示例表明您实际上并不希望在后台运行守护进程的瘦服务器。您想要一个在单独的线程中运行并将控制返回给主线程的瘦服务器,以便您可以使用 Selenium,并且当您的应用程序终止时,瘦服务器也会终止。

如果我的看法是错误的,并且如果您真的想要一个守护进程的瘦服务器,那么您的做法就错了。您应该将瘦服务器视为一个应用程序,将 Selenium 应用程序视为另一个应用程序。 (单独启动和管理它们,而不是作为单个 Ruby 应用程序)

但如果我是对的,那么它应该很简单:

require 'rack'
require 'thin'
require 'httparty' # used for demonstration purposes only

class RackApp
def call(env)
case Rack::Request.new(env).path_info
when //
[200, {"Content-Type" => "text/html"}, 'Hello World']
end
end
end

threads = []

# First start the Thin server
threads << Thread.new { Rack::Handler::Thin.run(RackApp.new) }

# Then sleep long enough for it to start before making an HTTP request
threads << Thread.new { sleep 2; puts HTTParty.get('http://localhost:8080/').response.body }

threads.each(&:join)

puts 'Back in the main thread'

控制台的输出是:

Thin web server (v1.7.2 codename Bachmanity)
Maximum connections set to 1024
Listening on localhost:8080, CTRL+C to stop
Hello World

您需要将 HTTPParty.get 调用替换为您对 Selenium 的调用。

这可能不是您想要的确切解决方案,因为在您点击 ^C 之前,您不会看到 Back in the main thread,即使 Selenium 线程已经完成它需要做的所有工作,因为 Thin 线程仍在运行:

Thin web server (v1.7.2 codename Bachmanity)
Maximum connections set to 1024
Listening on localhost:8080, CTRL+C to stop
Hello World
^CStopping ...
Back in the main thread

如果您希望 Ruby 应用程序在 Selenium 工作完成后终止,您可以将其修改为如下所示:

Thread.new { Rack::Handler::Thin.run(RackApp.new) }

selenium_thread = Thread.new { sleep 2; puts HTTParty.get('http://localhost:8080/').response.body }
selenium_thread.join

puts 'Back in the main thread'

然后您会看到类似这样的情况,其中 Ruby 应用程序在打印 Back in the main thread 后立即终止:

Thin web server (v1.7.2 codename Bachmanity)
Maximum connections set to 1024
Listening on localhost:8080, CTRL+C to stop
Hello World
Back in the main thread

关于ruby - 我如何通过代码守护 ruby​​ 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61422599/

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