Class: DRbQS::TaskGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/drbqs/task_generator.rb

Constant Summary collapse

DEBUG_TASK_PROGRESS =
1000

Instance Method Summary collapse

Constructor Details

#initialize(data = {}) ⇒ TaskGenerator

Returns a new instance of TaskGenerator.



33
34
35
36
37
38
39
40
# File 'lib/drbqs/task_generator.rb', line 33

def initialize(data = {})
  @source = DRbQS::TaskSource.new(data)
  @fiber = nil
  @iterate = nil
  @task_set = nil
  @fiber_init = nil
  @wait = false
end

Instance Method Details

#debug_all_tasks(opts = {}) ⇒ Object

Create all tasks for test and return [group_number, task_number] if all tasks created properly.



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/drbqs/task_generator.rb', line 115

def debug_all_tasks(opts = {})
  limit = opts[:limit]
  progress = opts[:progress]
  group_number = 0
  task_number = 0
  while ary = new_tasks
    ary.each do |t|
      unless DRbQS::Task === t
        raise "Invalid #{i}th task: #{t.inspect}"
      end
      task_number += 1
      if progress && (task_number % DEBUG_TASK_PROGRESS == 0)
        puts "#{task_number} tasks have been created."
      end
      if limit && task_number > limit
        break
      end
    end
    group_number += 1
  end
  [group_number, task_number]
end

#have_next?Boolean

Returns:

  • (Boolean)


42
43
44
# File 'lib/drbqs/task_generator.rb', line 42

def have_next?
  !!@fiber
end

#initObject



71
72
73
# File 'lib/drbqs/task_generator.rb', line 71

def init
  @fiber_init.call if @fiber_init
end

#new_tasksObject

Return an array of new tasks.



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/drbqs/task_generator.rb', line 76

def new_tasks
  if @fiber
    @wait = false
    task_ary = []
    iteration = @iterate
    iteration *= @task_set if @task_set
    iteration.times do |i|
      if task_new = @fiber.resume
        case task_new
        when DRbQS::Task
          task_ary << task_new
        when Array
          task_ary.concat(task_new)
        when :wait
          @wait = true
          break
        else
          raise "Invalid type of new task."
        end
      else
        @fiber = nil
        break
      end
    end
    if task_ary.size > 0
      if @task_set
        task_ary = task_ary.each_slice(@task_set).map do |ary|
          DRbQS::TaskSet.new(ary)
        end
      end
      return task_ary
    end
  end
  nil
end

#set(opts = {}, &block) ⇒ Object

The options :generate and :collect are available. opts is the number of tasks per one generation. The generator creates a task set from opts tasks.



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/drbqs/task_generator.rb', line 53

def set(opts = {}, &block)
  @iterate = opts[:generate] || 1
  @task_set = opts[:collect]
  if @iterate < 1 || (@task_set && @task_set < 1)
    raise ArgumentError, "Invalid option."
  end
  @fiber_init = lambda do
    @fiber = Fiber.new do
      begin
        @source.instance_eval(&block)
      rescue => err
        raise DRbQS::TaskCreatingError, "\n  #{err.to_s}\n#{err.backtrace.join("\n")}"
      end
      nil
    end
  end
end

#waiting?Boolean

Returns:

  • (Boolean)


46
47
48
# File 'lib/drbqs/task_generator.rb', line 46

def waiting?
  @wait
end