Sidekiq如何在线程之间共享变量

3
Rails 5.0.1,Ruby 2.4.0和Sidekiq 4.2.9。
我需要在后台作业中计算一些特定的数据。我已经通过Postgres实现了它,但我遇到了问题:Sidekiq并发会大量占用DB连接,如果我减少并发数,作业运行将需要很长时间。
我发现可以使用原子计数器,并在某个时期将结果保存到DB中。
那么我能在Sidekiq的线程之间共享变量吗?如果可以,我应该如何初始化共享变量?
感谢任何建议。

你能详细说明一下在Sidekiq任务之间实际上想要共享哪些信息吗? - undefined
我只需要存储一些数据的计数,当这个计数达到限制时,我应该忽略任务并停止处理。 - undefined
使用Redis是最合理的选择。 - undefined
你可以使用 Thread.get_thread_variable,但这只适用于在单台机器(和单个进程)上运行 Sidekiq 的情况。 - undefined
1个回答

2
如果在多个线程之间共享变量,你需要使用互斥锁来保证数据的安全,并且这种方式只适用于单进程。
相反,可以使用Redis命令来增加计数器。

https://redis.io/commands/incr


那么,使用互斥锁是个不好的主意。对吗? - undefined
你会失去Sidekiq提供的多线程优势。 - undefined
我并没有说使用互斥锁是一个坏主意,也没有说它是一个好主意。 - undefined
1
基本上,如果你想要并发性,并且有一个互斥锁来锁定共享数据,那么你就不再拥有并发性了。 - undefined
很遗憾,这并没有回答最初的问题。也许人们正在寻找一些可以分享的东西,结果却看到了“不要使用全局变量,使用Redis”的答案。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接