gpt4 book ai didi

Ruby:Sinatra 和一个程序中的无限循环

转载 作者:数据小太阳 更新时间:2023-10-29 08:32:53 25 4
gpt4 key购买 nike

我有一个程序,它在一个无限循环中做一些事情(它是一个守护进程)。这很好用。

现在我计划在 sintra 的帮助下为该守护进程提供一个网络界面。 sinatra 代码本身也可以正常工作。但是一旦我在一个脚本中有了循环和 sinatra 代码,sinatra 代码就执行。启动时没有错误消息,但本地网络服务没有启动。

这里的代码精简为基础:

#!/usr/bin/env ruby

require 'rubygems'
require 'sinatra'
require_relative 'lib/functions'

do_init_env # (some init steps, no influence on the startup of sinatra)

get '/' do
erb :web
end

# infinity Loop
loop do
if File.exists? somefile
do_something
end
sleep 10
end

禁用循环时,sinatra 启动正常:

ruby ./mydaemon.rb
[2013-02-26 12:57:24] INFO WEBrick 1.3.1
[2013-02-26 12:57:24] INFO ruby 1.9.3 (2013-02-06) [armv6l-linux-eabi]
== Sinatra/1.3.5 has taken the stage on 4567 for development with backup from WEBrick
[2013-02-26 12:57:24] INFO WEBrick::HTTPServer#start: pid=13457 port=4567
^C
== Sinatra has ended his set (crowd applauds)
[2013-02-26 12:57:36] INFO going to shutdown ...
[2013-02-26 12:57:36] INFO WEBrick::HTTPServer#start done.

启用循环时:

沉默,直到中断循环:

ruby ./mydaemon.rb

^C./mydaemon.rb:39:in `sleep': Interrupt
from ./mydaemon.rb:39:in `block in <main>'
from ./mydaemon.rb:33:in `loop'
from ./mydaemon.rb:33:in `<main>

最佳答案

Rack 在启动时按原样运行脚本。 “get”等命令只是为 Sinatra 存储信息,以便稍后响应机架。任何无限循环都会简单地开始。

您可以通过添加线程并在子线程上启动循环来解决此问题。如果循环正在做一些轻量级的事情,您可以通过与 Web 服务器共享一些内存来提高性能,那么这可能是值得的。但是,处理线程交互通常是一个令人头疼的编码问题。

您最好将网络服务器和长时间运行的循环分离到不同的脚本中,在它们自己的进程中运行,并让循环发出可读数据,例如一个文件或数据库,网络服务器可以获取并提供服务。

关于Ruby:Sinatra 和一个程序中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15088801/

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