我有一个控制器可以旋转6个sidekiq线程,以便更快地并行处理大文件。在此之前,我想为这些线程提供一些应该可用于所有线程的变量,因为它们的变量本身是相当大的内存密集型的。 (它只是从中读取,而不是写入,因此不存在并发问题)
换句话说,我的控制器看起来像这样
def foo
$bar1 = ....
$bar2 = ...
worker.perform_async()...
worker2.perform_async()...
end
我不想将这些全局变量放入perform方法中,因为将这些变量序列化为redis会使整个过程扼杀。我的问题是,由于没有方法错误,工人无法看到这些变量而死亡(即,试图调用.first on on,它会产生错误,因为var对工人来说是零)。
为什么?有没有其他方法可以做到这一点,不会杀死我的记忆? (也就是说,我不想占用6倍大小的同一个大阵列)
答案 0 :(得分:4)
Sidekiq在单独的进程上运行,因此它不会与工作者的发起者共享相同的内存。
如果数据是静态的,您可能希望在sidekiq进程的开头加载它(可能在配置sidekiq服务器时)。
如果每个任务发生变化,您应该以一种可以创建全局存储库来保存它的方式对其进行建模(如果redis不利于此,也许您可以尝试memcached)...