【问题标题】:Thread-safe alternative of global variables全局变量的线程安全替代方案
【发布时间】:2019-06-13 16:16:41
【问题描述】:

我想使用多线程 Puma 作为生产服务器,所以我的代码应该是线程安全的。 我读到全局变量的使用不是线程安全的。在这种情况下,全局变量的替代方法是什么? 我使用全局变量(没有值更改)作为设置/获取等的 Redis 键。

#initializers/redis.rb

$DRIVER_LOCATIONS = "driver_locations"

在代码中

REDIS.with do |conn|
  conn.geoadd($DRIVER_LOCATIONS, latitude, longitude, id)
end

或者没有必要改变什么?

【问题讨论】:

  • 如果您只是阅读它们,那么您应该没问题。当您尝试同时写入同一个地方时,会出现大多数/所有问题。顺便说一句,为什么这里是全局变量,而不是常量?
  • @anothermh:哦,但是使用单线程数据库会导致应用程序完全混乱。甚至根本没有数据库。
  • @anothermh:我是说 Redis 的单线程特性与不正确实现的多线程应用程序可能对自身造成的损坏/损坏的数量无关。

标签: ruby-on-rails ruby multithreading ruby-on-rails-5


【解决方案1】:

如 cmets 中所述,您可能应该在那里使用常量而不是全局变量

#initializers/redis.rb

DRIVER_LOCATIONS = "driver_locations"

# ...

REDIS.with do |conn|
  conn.geoadd(DRIVER_LOCATIONS, latitude, longitude, id)
end

在您的用例中使用全局变量应该不会那么糟糕,因为它是在初始化期间设置的,我假设它只完成一次。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
相关资源
最近更新 更多