Class: Thread::Pool::Task

Inherits:
Object
  • Object
show all
Defined in:
lib/thread/pool.rb

Overview

A task incapsulates a block being ran by the pool and the arguments to pass to it.

Constant Summary collapse

Timeout =
Class.new(Exception)
Asked =
Class.new(Exception)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(pool, *args, &block) ⇒ Task

Create a task in the given pool which will pass the arguments to the block.

[View source]

29
30
31
32
33
34
35
36
37
38
# File 'lib/thread/pool.rb', line 29

def initialize(pool, *args, &block)
  @pool      = pool
  @arguments = args
  @block     = block

  @running    = false
  @finished   = false
  @timedout   = false
  @terminated = false
end

Instance Attribute Details

#exceptionObject (readonly)

Returns the value of attribute exception.


25
26
27
# File 'lib/thread/pool.rb', line 25

def exception
  @exception
end

#poolObject (readonly)

Returns the value of attribute pool.


25
26
27
# File 'lib/thread/pool.rb', line 25

def pool
  @pool
end

#resultObject (readonly)

Returns the value of attribute result.


25
26
27
# File 'lib/thread/pool.rb', line 25

def result
  @result
end

#started_atObject (readonly)

Returns the value of attribute started_at.


25
26
27
# File 'lib/thread/pool.rb', line 25

def started_at
  @started_at
end

#threadObject (readonly)

Returns the value of attribute thread.


25
26
27
# File 'lib/thread/pool.rb', line 25

def thread
  @thread
end

#timeoutObject (readonly)

Returns the value of attribute timeout.


25
26
27
# File 'lib/thread/pool.rb', line 25

def timeout
  @timeout
end

Instance Method Details

#executeObject

Execute the task.

[View source]

57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/thread/pool.rb', line 57

def execute
  return if terminated? || running? || finished?

  @thread     = Thread.current
  @running    = true
  @started_at = Time.now

  pool.__send__ :wake_up_timeout

  begin
    @result = @block.call(*@arguments)
  rescue Exception => reason
    if reason.is_a? Timeout
      @timedout = true
    elsif reason.is_a? Asked
      return
    else
      @exception = reason
      raise @exception if Thread::Pool.abort_on_exception
    end
  end

  @running  = false
  @finished = true
  @thread   = nil
end

#finished?Boolean

Returns:

  • (Boolean)
[View source]

44
45
46
# File 'lib/thread/pool.rb', line 44

def finished?
  @finished
end

#raise(exception) ⇒ Object

Raise an exception in the thread used by the task.

[View source]

85
86
87
# File 'lib/thread/pool.rb', line 85

def raise(exception)
  @thread.raise(exception)
end

#running?Boolean

Returns:

  • (Boolean)
[View source]

40
41
42
# File 'lib/thread/pool.rb', line 40

def running?
  @running
end

#terminate!(exception = Asked) ⇒ Object

Terminate the exception with an optionally given exception.

[View source]

90
91
92
93
94
95
96
97
98
# File 'lib/thread/pool.rb', line 90

def terminate!(exception = Asked)
  return if terminated? || finished? || timeout?

  @terminated = true

  return unless running?

  self.raise exception
end

#terminated?Boolean

Returns:

  • (Boolean)
[View source]

52
53
54
# File 'lib/thread/pool.rb', line 52

def terminated?
  @terminated
end

#timeout!Object

Force the task to timeout.

[View source]

101
102
103
# File 'lib/thread/pool.rb', line 101

def timeout!
  terminate! Timeout
end

#timeout?Boolean

Returns:

  • (Boolean)
[View source]

48
49
50
# File 'lib/thread/pool.rb', line 48

def timeout?
  @timedout
end

#timeout_after(time) ⇒ Object

Timeout the task after the given time.

[View source]

106
107
108
109
110
111
112
# File 'lib/thread/pool.rb', line 106

def timeout_after(time)
  @timeout = time

  pool.__send__ :timeout_for, self, time

  self
end