LoginSignup
7
7

More than 5 years have passed since last update.

ActiveJobでメソッドの遅延実行

Last updated at Posted at 2016-02-27

メソッドの遅延実行とは何か。
つまるところ、同期的な処理を非同期に処理をしたい。

.delayedでメソッドの実行を遅延する

パッと探した感じ見当たらなかったので、gemを入れるだけで簡単に導入できるようにした。
activejob-delayed_executionを入れるだけで、メソッドを非同期に実行することができる。

gem 'activejob-delayed_execution'

# Railsなら config/initializers/activejob_delayed_execution.rb
# Define .delayed method
ActiveRecord::Base.include(ActiveJob::DelayedExecution)


item = Item.first
item.generate_manuscript # めっちゃ重い処理。ブロッキングする
item.delayed.generate_manuscript # ( ゚∀゚)o彡゚非同期に実行される

ActiveJobに乗っているため、SidekiqのDelayed extensionと比べてredis等のメモリ消費が少なくてエコである。(3~10倍ほど変わる)

思いついて1時間ほどでProductionへ導入したのだけれど、今のところ元気に動いている。
ActiveJob便利。


お仕事ではpixivFACTORYというサービスで、ユーザーさんにグッズづくりを楽しんでもらっています。

このサービスでは印刷用のデータを生成するために、複雑で重い処理をしている。

# だいたいこんなイメージ
class Item < ActiveRecord::Base
  def generate_manuscript
    # 画像などを生成するめっちゃ重い処理
  end
end

こういった処理を書くのにActiveJobを使うのだろうけれど、メソッドを呼び出すだけの処理をわざわざJobを定義するのは冗長だ。

こういった仕組みで簡単に遅延処理ができるようになったのは嬉しい。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7