Использование EventMachine для настройки бесконечного цикла для генерации случайных данных

Я пытаюсь настроить автоматический стресс-тест и передать случайно сгенерированные данные в Redis, а затем заставить потребителя (как другой компонент, считываемый из Redis) обрабатывать случайные данные.

Чтобы симулировать случайно сгенерированные данные как приближенные к реальному времени, я решил сделать бесконечный цикл и использовать EventMachine для обработки синхронизации. Я не уверен, что я делаю с EventMachine, но я слышал, что это будет намного лучше, чем продолжать создавать новые темы и блокировать основной процесс. Я делаю это правильно?

EventMachine.synchrony do

  @redis = EM::Hiredis.connect

  # hit Control + C to stop
  Signal.trap("INT")  { EventMachine.stop }
  Signal.trap("TERM") { EventMachine.stop }

  trip_id = 0
  loop do
    longitude, latitude = [0.0, 0.0]
    for i in 0..100
      # now loop
      longitude, latitude = random_coordinates

      sleep 0.05 # sleep a bit to simulate the real world 
    end

    puts "this trip #{trip_id} | #{longitude} : #{latitude}"
    trip_id += 1

    redis.set('trip_id', trip_id)
  end
end

ИЗДАН 1

Так что я в конечном итоге сделать это с пулом потоков

require "thread/pool"
require "json"
require "redis"

require 'thread_safe'

def publish_on_redis(hash)
  @redis ||= Redis.new
  @redis.publish("trips", hash.to_json)
end

# Using thread-safe data structure
@trip_id_list = ThreadSafe::Array.new()
TRIP.times {|n| @trip_id_list[n] = n}
@trip_id_list.shuffle!

pool = Thread.pool(TRIP)
loop do
  @trip_id_list.each do |trip_id|
    pool.process {
      longitude, latitude = [0.0, 0.0]
      # Everything has to be UTC timestamp, everyone is on the same timezone
      start = Time.now.utc
      while((Time.now.utc - start) < @total_duration)
        longitude, latitude = random_coordinates_radius
        publish_on_redis({:id => trip_id, :time => Time.now, :longitude => longitude, :latitude => latitude})
        sleep 1 # sleep at each run some amount of times
      end
      publish_on_redis({:id => trip_id, :time => Time.now, :longitude => longitude, :latitude => latitude})
      @trip_id_list.delete(trip_id)
    }
  end

  break # will have to exit the infinite loop
end
pool.shutdown

1 ответ

Генерирование случайных событий, как вы делаете здесь, кажется правильным.

Тем не менее, вы вообще не обращаете внимания на redis, вы делаете только простой "набор", который перезапишет ключ новыми данными, если они существуют.

Я предлагаю использовать конвейер, который вы заполняете довольно большим количеством данных, которые вы выполняете + ожидаете в блоке тестирования (со сном).

Переместите оператор сна за пределы вашего кода подготовки данных.

Надеюсь, это поможет, TW

Другие вопросы по тегам