Использование 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