当前位置: 首页 > 知识库问答 >
问题:

使用EventMachine设置无限循环以生成随机数据

祁建业
2023-03-14

我试图设置一个自动压力测试,并将随机生成的数据输入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个答案

闾丘才哲
2023-03-14

像您在这里所做的那样生成随机事件似乎是正确的。

然而,您根本没有强调redis,您只是在做一个简单的“集合”,如果密钥存在,它将用新数据覆盖密钥。

我建议使用一个填充了大量数据的管道,您可以在测试块中等待它的执行(睡眠)。

将sleep语句移到数据准备代码之外。

希望这有帮助,TW

 类似资料:
  • 这个脚本应该以随机生成的延迟滚动浏览网站上的每个容器。对于循环中的每次迭代,我要将ms的“暂停”替换为一个在和秒之间随机生成的数字。 随机数生成器: 就像这样工作很好。在每次迭代之后,会有2秒的暂停。但是,当我移除注释以添加行以随机化每次迭代之间的时间时,值(它应该滚动到哪个容器)一开始很好,但后来也变成随机的。 控制台输出: 我该怎么解决这个?

  • 我需要在eventmachine上有一个无限循环,它不断地读取redis队列。下面是我的代码。递归是正确的方法吗?我尝试了loop,但无法以那种方式工作。

  • 问题内容: 我需要生成一个随机数。 看来该功能已不复存在。 我的选择是, 和 。 我在函数上找不到任何文档,头文件中也没有注释。 问题答案: ===== Swift 4.2 / Xcode 10 ===== 斯威夫特在引擎盖下用来完成工作。 ===== Swift 4.1 / Xcode 9 ===== 返回 0* 到 4294967295之间 的随机数 * 返回 0.0* 到 1.0 范围内的随

  • 我不是只想用第一个数字来完成这个操作,而是使用while循环和if条件,使我在键盘上输入的任何内容都变成一个整数。 你觉得问题出在哪里?请帮帮我.

  • random 生成随机数包 文档:https://www.npmjs.com/package/random 安装:npm install --save random 封装代码: app / extend / context.js // 导入 jwt const jwt = require('jsonwebtoken') // 导入随机数包 const random = require('rando

  • 问题 你需要生成在一定范围内的随机数。 解决方案 使用 JavaScript 的 Math.random() 来获得浮点数,满足 0<=X<1.0 。使用乘法和 Math.floor 得到在一定范围内的数字。 probability = Math.random() 0.0 <= probability < 1.0 # => true # 注意百分位数不会达到 100。从 0 到 100 的范围实