我有一个 Controller 可以分离出 6 个 sidekiq 线程,以便更快地并行处理大文件。然而,在此之前,我想为这些线程提供一些变量,这些变量应该在所有线程中可用,因为它们变量本身是相当内存密集型的。 (只是从那里读取,没有写入,所以并发问题不存在)
换句话说,我的 Controller 看起来像这样
def foo
$bar1 = ....
$bar2 = ...
worker.perform_async()...
worker2.perform_async()...
end
我不想将这些全局变量放入执行方法中,因为将它们序列化到 Redis 会阻塞整个过程。我的问题是工作人员看不到这些变量并因为无方法错误而死亡(即尝试调用 .first 对它们给出该错误,因为工作人员的 var 为 nil)。
怎么会?有没有其他方法可以做到这一点而不会破坏我的内存? (即我不想用 6 倍的相同大数组占用大部分内存)
最佳答案
Sidekiq 在单独的进程上运行,因此它不与 worker 的发起者共享相同的内存。
如果数据是静态的,您可能希望在 sidekiq 进程启动时加载它(可能在您配置 sidekiq 服务器时)。
如果它根据任务而改变,你应该以一种可以创建全局存储库来保存它的方式对其进行建模(如果 redis 不适合这个,也许你可以尝试 memcached )...
关于ruby-on-rails - Sidekiq 线程访问全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27547319/