Rails マルチスレッド実行環境でデッドロックが発生

2020年7月29日水曜日

Rails

t f B! P L

概要

RailsでThreadを利用して並行処理を実装したが、デッドロックが発生。処理が止まってしまった。エラーも発生しない

class MainController
  def thread_exe
    sub_a = Sub_A.find(1)
    th = Thread.new { Sub_A.call_b }
    th.join
  end
end
class Sub_A < ApplicationRecord
  def call_b
    Sub_B.call_b # ここでデッドロック
  end
end
class Sub_B < ApplicationRecord
  def call_b
    # 何らかの処理
  end
end

解決策

permit_concurrent_loadsメソッドで外部クラスの自動読み込みを許可する

class MainController
  def thread_exe
    sub_a = Sub_A.find(1)
    th = Thread.new { Sub_A.call_b }
    # ここを追加
    ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
      th.join
    end
  end
end

予備知識

Threadとは

一連の処理の流れのこと。複数の処理の流れはマルチスレッド

リエントラント

処理を実行中に再び同じ処理が呼び出され並行に実行されたとしても、データ破壊や矛盾などが発生せず、安全に処理終了できること

Railsの自動読み込み

Railsではrequireを書かなくてもappはいかのcontrollersやmodelsなどにあるファイルを自動読み込みする

自己紹介

Webエンジニアをやっています。日々思ったことや、読書レビュー、IT系の記事などを書き連ねています

広告

[書籍] 世界一楽しい決算書の読み方感想まとめ

  こういう人におすすめ 決算書を読もうとして挫折した人 企業分析したい投資家 会社で経営企画担当、管理職などのポジションの人 概要 著者はTwitterで会計クイズを行なっている 「大手町のランダムウォーカー」さん 。 「日本人全員が財務諸表を読める世界を創る」 を合言葉にして...

QooQ