【问题标题】:Sidekiq threads accessing global variableSidekiq 线程访问全局变量
【发布时间】:2014-12-18 21:11:07
【问题描述】:

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

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

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

我不想将这些全局变量放入 perform 方法中,因为将它们序列化到 redis 会阻塞整个过程。我的问题是工作人员看不到这些变量并因为无方法错误而死亡(即尝试在其中调用 .first 会给出该错误,因为 var 对于工作人员来说是 nil)。

怎么会?有没有其他方法可以做到这一点不会杀死我的记忆? (即我不想用 6x 相同的大数组占用大部分内存)

【问题讨论】:

  • 这些变量的本质是什么?它们包含什么样的数据?
  • 它们包含大量散列,其中包含几个整数和字符串,这是 Active Record 集合、group_by 预先调用的结果

标签: ruby-on-rails ruby multithreading sidekiq


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多