新手问题 如何在不使用全局变量情况下保持变量内容呢

netuser · 2018年09月11日 · 最后由 netuser 回复于 2018年09月14日 · 2514 次阅读
a.xxx{ |msg| function(msg)}
def function (msg)
  price = msg.price
  size = msg.size
  status = msg.size
  timestamp = msg.timestamp
end

现在是这样的,price/size/status/timestamp 每次内容只更新一个,然后保存到数据库 其他的变量值需要延用上次得到的值, 目前的解决方案是使用全局变量声明,但涉及到多个同时跑的时候就很捉襟见肘 一个初步的想法是将 def 直接写到{msg}这里,还有更优雅一点的方案么

yunshang 回复

gem ' cache' 这个?

当你陷入了某个奇怪的代码实现思路时,有可能是你的设计思路有问题,不妨把你的原始需求提出来,让大家看看。

showlovel 回复

需求是这样, A 代码在一直推送消息 msg

.xxx{ |msg| function(msg)}

msg 需要进行处理,所以有了 function 推送的格式可能是这样{ tick_price => '' , timestamp =>'' , tick_size = '}

但是每次只推送其中的一个数据,另外两个是 nil

不要搞混了目的和手段。用不用全局变量是手段,目的是使代码更好 debug 更容易维护。状态如果是全局的,那当然就要用全局变量了。不该做的是用全局变量保存局部状态。

不过,这个数据有两份,数据库的那份应该作为 source of truth, 你这个应该认为是 cache 更好一些。

SQL update 语句可以只更改一个 field,然后用 returning 把当前状态返回就好了。参考:

https://www.postgresql.org/docs/current/static/sql-update.html

luikore 回复

因为这里考虑到效率的问题,频繁读取数据库对性能损耗会比较大, 之前有考虑过直接 Model.last 这样的模式, update 在这里不太适用,因为要创建新的记录 那么目前看来只能适用 Model.last.timestamp 这样来读取上一次的内容了 很头疼,因为要同时跑几个 function,对应不同的数据表

netuser 回复

😅 可以考虑先缓存下 Dirty 数据,最后再一次性保存。

8 楼 已删除
9 楼 已删除
10 楼 已删除
*.previous_changes
netuser 回复

什么场景抠性能这么极致?

lithium4010 回复

量化交易

需要 登录 后方可回复, 如果你还没有账号请 注册新账号