Method: Zold::Farm#start

Defined in:
lib/zold/node/farm.rb

#start(host, port, threads: Concurrent.processor_count) ⇒ Object

Starts a farm, all threads, and yields the block provided. You are supposed to use it only with the block:

Farm.new.start('example.org', 4096) do |farm|
  score = farm.best[0]
  # Everything else...
end

The farm will stop all its threads and close all resources safely right after the block provided exists.



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/zold/node/farm.rb', line 110

def start(host, port, threads: Concurrent.processor_count)
  raise 'Block is required for the farm to start' unless block_given?
  @log.info('Zero-threads farm won\'t score anything!') if threads.zero?
  if best.empty?
    @log.info("No scores found in the cache at #{@cache}")
  else
    @log.info("#{best.size} scores pre-loaded from #{@cache}, the best is: #{best[0]}")
  end
  (1..threads).map do |t|
    @threads.add do
      Thread.current.thread_variable_set(:tid, t.to_s)
      Endless.new("f#{t}", log: @log).run do
        cycle(host, port, threads)
      end
    end
  end
  unless threads.zero?
    ready = false
    @threads.add do
      Endless.new('cleanup', log: @log).run do
        cleanup(host, port, threads)
        ready = true
        sleep(1)
      end
    end
    loop { break if ready }
  end
  if threads.zero?
    cleanup(host, port, threads)
    @log.info("Farm started with no threads (there will be no score) at #{host}:#{port}")
  else
    @log.info("Farm started with #{@threads.count} threads (one for cleanup) \
at #{host}:#{port}, strength is #{@strength}")
  end
  begin
    yield(self)
  ensure
    @threads.kill
  end
end