首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有"watchdog“的Ruby线程

带有"watchdog“的Ruby线程
EN

Stack Overflow用户
提问于 2012-04-06 13:03:17
回答 3查看 830关注 0票数 1

我正在实现一个ruby服务器,用于处理从GPRS模块创建的套接字。问题是,当模块断电时,没有任何迹象表明插座关闭。

我正在使用线程来处理同一台服务器上的多个套接字。我想问的是:有没有一种方法可以在线程中使用计时器,在每次套接字输入后重新设置它,如果它达到超时,就关闭线程?我在哪里可以找到关于这方面的更多信息?

编辑:未检测到套接字关闭的代码示例

代码语言:javascript
复制
require 'socket'

server = TCPServer.open(41000)
loop do
    Thread.start(server.accept) do |client|
        puts "Client connected"

        begin
            loop do
                line = client.readline

                open('log.txt', 'a') { |f|
                    f.puts line.strip
                }
            end
        rescue
            puts "Client disconnected"
        end
    end
end 
EN

回答 3

Stack Overflow用户

发布于 2012-04-06 13:12:11

我认为你需要一个心跳机制。

票数 1
EN

Stack Overflow用户

发布于 2012-04-06 17:22:00

据猜测,您的套接字莫名其妙地关闭了,因为您没有捕捉到远程端关闭套接字时引发的异常。

您需要将连接处理程序包装在一个异常捕获块中。

在不知道您使用的是什么模块/模型的情况下,我只会胡编乱造,说您有一个process_connection例程。所以你需要这样做:

代码语言:javascript
复制
def process_connection(conn)
    begin
        # do stuff
    rescue Exception => e
        STDERR.print "Caught exception #{e}: #{e.message}\n#{e.backtrace}\n"
    ensure
        conn.close
    end
end

这将捕获所有异常,并使用堆栈跟踪将它们转储到stderr。从那里你可以看到是什么导致了它们,并可能在其他地方更优雅地处理它们。

票数 0
EN

Stack Overflow用户

发布于 2015-03-23 23:20:12

只需检查standar API超时:

代码语言:javascript
复制
require 'timeout'
status = Timeout::timeout(3){sleep(1)}
puts status.inspect
status = Timeout::timeout(1){sleep(2)}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10039340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档