1

我有一个为 Flink CEP 生成事件的生成器,代码如下。基本上,我正在使用Thread.sleep()并且我在某处读到即使我们使用 java 的睡眠时间也不能少于 1 毫秒System.nanoTime()。生成器的代码是

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() {

}

}

我将在这里用简单的话来说明我的要求。我希望生成器类生成事件,比如说 1200 Hz 的 ECG 流。该生成器将接受我们必须生成流的输入速率和总时间等参数。

到目前为止一切顺利,问题是我需要每秒发送超过 1000 个事件。如何通过使用生成值的生成器函数来做到这一点U[10,20]

另外,如果我在上面使用错误的方式生成 x 个事件/秒,请告诉我。

Sleeptime = 1000 / InputRate;

提前致谢

4

1 回答 1

0

Windows 系统中的最短睡眠时间约为 10 毫秒,而在 Linux 和 Macintosh 中为 1 毫秒,如此处所述

睡眠的粒度一般受线程调度器的中断周期约束。在 Linux 中,这个中断周期在最近的内核中一般为 1ms。在 Windows 中,调度程序的中断周期通常在 10 或 15 毫秒左右

通过我的研究,我了解到在 Java 中使用纳米时间睡眠对于操作系统级别的问题没有帮助。如果您想以arrival rate > 1000受控方式发送数据,则可以使用实时操作系统 (RTOS) 来完成,因为它们可以休眠不到一毫秒。现在,我想出了另一种方法,但在这个解决方案中,到达间隔时间不会不断分布。

假设您想要 的到达率3000 events/ second,那么您可以创建一个for loop迭代 3 次以在每次迭代中发送数据然后休眠的1ms。所以对于 3 个元组,到达间隔时间会很接近,但问题会得到解决。这可能是一个愚蠢的解决方案,但它有效。

请让我知道是否有更好的解决方案。

于 2018-06-27T14:37:12.537 回答