4

我有一个简单的 Sinatra 应用程序,我想在所有会话和请求中共享一个变量。

configure do
  @@click_count = 0
end

def send_message(text)
  # ignore, this part works
end

post '/click' do
  @@click_count = @@click_count + 1
  send_message "clicks: #{@@click_count}"
end

发送的消息总是clicks: 1而不是递增。我也尝试过set :click_count, 0settings.click_count = settings.click_count + 1但我仍然得到同样的东西。

我正在使用 shotgun 在本地运行服务器,shotgun web.rb -p 4567 -E production因为在非生产环境中提到的另一个问题是,服务器会在每个丢失状态的请求上重新启动。

任何想法如何让它发挥作用?

4

2 回答 2

5

Sinatra 本身不会在开发模式下的每个请求上重新启动(它曾经),但霰弹枪具有这种效果:

每次收到请求时,它会分叉,在子进程中加载​​应用程序,处理请求,然后退出子进程。

只需使用ruby web.rb,一切都应该正常工作(从您的评论来看,您似乎知道模线程问题)。

于 2012-05-31T22:42:20.607 回答
2

我不确定该configure块多久运行一次。尝试使用全局变量(例如$click_count)而不是类实例变量,并在程序的最顶部、任何块之外对其进行初始化。

于 2012-05-31T21:36:25.127 回答