如何使用休眠时间在 java 中每秒生成超过 1000 个事件
How to generate more than 1000 events / second in java using sleep time
我有一个为 Flink CEP 生成事件的生成器,下面给出了其代码。基本上,我正在使用 Thread.sleep()
,并且我在某处读到即使我们使用 System.nanoTime()
,java 也不能睡少于 1 毫秒。生成器的代码是
public class RR_interval_Gen extends RichParallelSourceFunction<RRIntervalStreamEvent> {
Integer InputRate ; // events/second
Integer Sleeptime ;
Integer NumberOfEvents;
public RR_interval_Gen(Integer inputRate, Integer numberOfEvents ) {
this.InputRate = inputRate;
Sleeptime = 1000 / InputRate;
NumberOfEvents = numberOfEvents;
}
@Override
public void run(SourceContext<RRIntervalStreamEvent> sourceContext) throws Exception {
long currentTime;
Random random = new Random();
int RRInterval;
int Sensor_id;
for(int i = 1 ; i <= NumberOfEvents ; i++) {
Sensor_id = 2;
currentTime = System.currentTimeMillis();
// int randomNum = rand.nextInt((max - min) + 1) + min;
RRInterval = 10 + random.nextInt((20-10)+ 1);
RRIntervalStreamEvent stream = new RRIntervalStreamEvent(Sensor_id,currentTime,RRInterval);
synchronized (sourceContext.getCheckpointLock())
{
sourceContext.collect(stream);
}
Thread.sleep(Sleeptime);
}
}
@Override
public void cancel() {
}
}
我将在这里用简单的语言说明我的要求。
我希望生成器 class 生成事件,假设是 1200 Hz 的 ECG 流。该生成器将接受输入速率和生成流所需的总时间等参数。
到目前为止一切顺利,问题是我需要每秒发送超过 1000 个事件。如何使用生成值 U[10,20]
?
的生成器函数来执行此操作
另外,如果我在下面使用错误的方式生成 x 个事件/秒,请告诉我。
Sleeptime = 1000 / InputRate;
提前致谢
Windows systems is ~ 10 ms and in Linux and Macintosh is 1 millisecond as mentioned here中睡眠时间最少。
The granularity of sleep is generally bound by the thread scheduler's
interrupt period. In Linux, this interrupt period is generally 1ms in
recent kernels. In Windows, the scheduler's interrupt period is
normally around 10 or 15 milliseconds
通过我的研究,我了解到在 java 中使用纳米时间睡眠对 OS 级别的问题没有帮助。如果您想以受控方式在 arrival rate > 1000
发送数据,则可以使用实时操作系统 (RTOS) 来完成,因为它们可以休眠不到一毫秒。现在,我想出了另一种方法,但在这个解决方案中,到达间隔时间不会持续分布。
假设您想要 3000 events/ second
的到达率,那么您可以创建一个 for loop
,它迭代 3 次以在每次迭代中发送数据,然后休眠 1ms
。所以对于 3 元组,到达间隔时间将彼此接近,但问题将得到解决。这可能是一个愚蠢的解决方案,但它确实有效。
如果有更好的解决方案,请告诉我。
我有一个为 Flink CEP 生成事件的生成器,下面给出了其代码。基本上,我正在使用 Thread.sleep()
,并且我在某处读到即使我们使用 System.nanoTime()
,java 也不能睡少于 1 毫秒。生成器的代码是
public class RR_interval_Gen extends RichParallelSourceFunction<RRIntervalStreamEvent> {
Integer InputRate ; // events/second
Integer Sleeptime ;
Integer NumberOfEvents;
public RR_interval_Gen(Integer inputRate, Integer numberOfEvents ) {
this.InputRate = inputRate;
Sleeptime = 1000 / InputRate;
NumberOfEvents = numberOfEvents;
}
@Override
public void run(SourceContext<RRIntervalStreamEvent> sourceContext) throws Exception {
long currentTime;
Random random = new Random();
int RRInterval;
int Sensor_id;
for(int i = 1 ; i <= NumberOfEvents ; i++) {
Sensor_id = 2;
currentTime = System.currentTimeMillis();
// int randomNum = rand.nextInt((max - min) + 1) + min;
RRInterval = 10 + random.nextInt((20-10)+ 1);
RRIntervalStreamEvent stream = new RRIntervalStreamEvent(Sensor_id,currentTime,RRInterval);
synchronized (sourceContext.getCheckpointLock())
{
sourceContext.collect(stream);
}
Thread.sleep(Sleeptime);
}
}
@Override
public void cancel() {
}
}
我将在这里用简单的语言说明我的要求。 我希望生成器 class 生成事件,假设是 1200 Hz 的 ECG 流。该生成器将接受输入速率和生成流所需的总时间等参数。
到目前为止一切顺利,问题是我需要每秒发送超过 1000 个事件。如何使用生成值 U[10,20]
?
另外,如果我在下面使用错误的方式生成 x 个事件/秒,请告诉我。
Sleeptime = 1000 / InputRate;
提前致谢
Windows systems is ~ 10 ms and in Linux and Macintosh is 1 millisecond as mentioned here中睡眠时间最少。
The granularity of sleep is generally bound by the thread scheduler's interrupt period. In Linux, this interrupt period is generally 1ms in recent kernels. In Windows, the scheduler's interrupt period is normally around 10 or 15 milliseconds
通过我的研究,我了解到在 java 中使用纳米时间睡眠对 OS 级别的问题没有帮助。如果您想以受控方式在 arrival rate > 1000
发送数据,则可以使用实时操作系统 (RTOS) 来完成,因为它们可以休眠不到一毫秒。现在,我想出了另一种方法,但在这个解决方案中,到达间隔时间不会持续分布。
假设您想要 3000 events/ second
的到达率,那么您可以创建一个 for loop
,它迭代 3 次以在每次迭代中发送数据,然后休眠 1ms
。所以对于 3 元组,到达间隔时间将彼此接近,但问题将得到解决。这可能是一个愚蠢的解决方案,但它确实有效。
如果有更好的解决方案,请告诉我。