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系の記事などを書き連ねています

広告

[書籍] ティムクック アップルをさらなる高みへと押し上げた天才 感想まとめ

   こういう人におすすめ ティムクックのことを知らないという人 アップル、ジョブズのファン 概要 2011年 ティムクック がAppleのCEOを引き継ぎました。 クック の知名度は低く、批評家たちは ジョブズ なしではAppleは終わりを迎えるだろうと危惧していました。 しか...

QooQ