Sidekiq线程访问全局变量

时间:2014-12-18 13:06:57

标签: ruby-on-rails ruby multithreading sidekiq

我有一个控制器可以旋转6个sidekiq线程,以便更快地并行处理大文件。在此之前,我想为这些线程提供一些应该可用于所有线程的变量,因为它们的变量本身是相当大的内存密集型的。 (它只是从中读取,而不是写入,因此不存在并发问题)

换句话说,我的控制器看起来像这样

def foo
  $bar1 = ....
  $bar2 = ...
  worker.perform_async()...
  worker2.perform_async()...
end

我不想将这些全局变量放入perform方法中,因为将这些变量序列化为redis会使整个过程扼杀。我的问题是,由于没有方法错误,工人无法看到这些变量而死亡(即,试图调用.first on on,它会产生错误,因为var对工人来说是零)。

为什么?有没有其他方法可以做到这一点,不会杀死我的记忆? (也就是说,我不想占用6倍大小的同一个大阵列)

1 个答案:

答案 0 :(得分:4)

Sidekiq在单独的进程上运行,因此它不会与工作者的发起者共享相同的内存。

如果数据是静态的,您可能希望在sidekiq进程的开头加载它(可能在配置sidekiq服务器时)。

如果每个任务发生变化,您应该以一种可以创建全局存储库来保存它的方式对其进行建模(如果redis不利于此,也许您可​​以尝试memcached)...