自制红宝石计时器内螺纹

时间:2014-05-03 22:54:14

标签: ruby multithreading session

我正在尝试为客户端/服务器网络项目创建会话超时系统。发生的事情是客户端连接并且在验证服务器时会创建一个保存超时,会话ID和线程句柄的会话对象。从这里开始,客户端每隔一段时间就发送一个保持活动的数据包,服务器将访问该会话对象并重置超时。

以下是一些代码,我将在底部解释每个函数:

nodeCache.rb

@nodeCache   = []

def nodeAdd(nodeName)
    nodeHash = {:nodeName => nodeName, :session => createSession(nodeName)}
    @nodeCache.push(nodeHash)

    return true
end

def nodeKeepAlive(nodeName)
    @nodeCache.each do |node|
        if node[:nodeName].eql? nodeName
            session = node[:session]
            session.timer.thread_variable_set(:expire, 10)
            return true
        end
    end

    return false
end

nodeAdd方法只需要一个节点ID并创建一个哈希值存储在一个数组中,以便我可以轻松跟踪与该节点相关的未来数据。

nodeKeepAlive函数遍历节点哈希数组,搜索保持活动的节点,一旦发现它抓取其会话对象并尝试重置线程,以便计时器重置为默认值。

NodeSession.rb

require "thread"

class Session
    attr_reader   :nodeName
    attr_accessor :expire, :timer

    def initialize(nodeName)
        @nodeName = nodeName
        @expire   = 10
        @timer    = nil
    end
end

def start(session)
    expire = session.expire
    alive  = true

    while (expire -= 1) > 0
        puts "timer tick #{expire}"
        sleep(1)
    end

    puts "timer expired"
    alive = false 
end

def createSession(nodeName)
    session = Session.new(nodeName)
    session.expire = 10
    session.timer = Thread.new { start(session) }
    return session
end

Session类是一个存储节点名称,过期超时和线程句柄的对象。

start方法是线程用来减少过期时间的方法,如果它达到0,它将通知我该节点的会话已超时(最终)。

createSession方法创建一个新的会话对象,对其进行初始化,然后启动开始倒计时的线程,并返回要存储在哈希的节点缓存数组中的会话对象。


我遇到的问题是我无法从线程外部重置计时器。我已经尝试使用光纤局部变量赋值,线程局部变量赋值(thread_variable_set / get),并且只是尝试重置会话对象的到期,我无法弄清楚如何执行此操作。如果有人可以引导我阅读一些文档或阅读如何更改线程内的局部变量,我们将不胜感激。如果有人可以概述一种更好的方法来设置类似于此设置的保持活动系统,我甚至会接受。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我建议你解决你的问题。我会保持高位,因为这是一个很长的问题。

创建会话时,请使用Time.now获取当前时间并将其存储在属性last_access中。

使用会话时:

if Time.now > (last_access + max_time)
  # close the session and ask for open a new one
else
  last_access = Time.now
  #allow to continue
end