Class: Delayer::Deferred::Worker

Inherits:
Object
  • Object
show all
Defined in:
lib/delayer/deferred/worker.rb

Overview

Deferredを実行するためのWorker。Deferredチェインを実行するFiberを 管理する。

pushに渡すオブジェクトについて

Worker#push に渡す引数は、activateメソッドを実装している必要がある。

activate(response)

Args

response

Delayer::Deferred::Response::Base Deferredに渡す値

Returns

Delayer::Deferred::Response::Base

これを返すと、値の自動変換が行われないため、意図的に失敗させたり、Deferredを次のブロックに伝搬させることができる。

Delayer::Deferred::Chainable

戻り値のDeferredが終わるまでWorkerの処理を停止する。 再開された時、結果は戻り値のDeferredの結果に置き換えられる。

else

Delayer::Deferred::Response::Ok.new の引数に渡され、その結果が利用される

Instance Method Summary collapse

Constructor Details

#initialize(delayer:, initial:) ⇒ Worker

Returns a new instance of Worker.


26
27
28
# File 'lib/delayer/deferred/worker.rb', line 26

def initialize(delayer:, initial:)
  @delayer, @initial = delayer, initial
end

Instance Method Details

#give_response(response, deferred) ⇒ Object

Awaitから復帰した時に呼ばれる。

Args

response

Awaitの結果(Delayer::Deferred::Response::Base)

deferred

現在実行中のDeferred


49
50
51
52
53
54
55
56
57
# File 'lib/delayer/deferred/worker.rb', line 49

def give_response(response, deferred)
  @delayer.new do
    next if deferred.spoiled?
    deferred.exit_await
    fiber.resume(response).accept_request(worker: self,
                                          deferred: deferred)
  end
  nil
end

#push(deferred) ⇒ Object


30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/delayer/deferred/worker.rb', line 30

def push(deferred)
  deferred.reserve_activate
  @delayer.new do
    next if deferred.spoiled?
    begin
      fiber.resume(deferred).accept_request(worker: self,
                                            deferred: deferred)
    rescue Delayer::Deferred::SequenceError => err
      err.deferred = deferred
      raise
    end
  end
  nil
end

#resume_pass(deferred) ⇒ Object

Tools#pass から復帰した時に呼ばれる。

Args

deferred

現在実行中のDeferred


62
63
64
65
66
67
68
69
# File 'lib/delayer/deferred/worker.rb', line 62

def resume_pass(deferred)
  deferred.exit_pass
  @delayer.new do
    next if deferred.spoiled?
    fiber.resume(nil).accept_request(worker: self,
                                     deferred: deferred)
  end
end