Concurrency 风暴喷口应该休眠()还是屈服()?

Concurrency 风暴喷口应该休眠()还是屈服()?,concurrency,apache-storm,thread-sleep,Concurrency,Apache Storm,Thread Sleep,nextTuple()的Storm文档说明如下: 当没有要发出的元组时,有礼貌地在短时间内(比如一毫秒)进行下一次三元组睡眠,以免浪费太多CPU 在Utils.class中似乎有这样一种方法:Utils.sleep(长毫秒) 但是,在Apache Storm本身提供的一个喷口中,mqttspoot,使用了不同的方法: public void nextTuple() { AckableMessage tm = this.incoming.poll(); if(tm != null)

nextTuple()的Storm文档说明如下:

当没有要发出的元组时,有礼貌地在短时间内(比如一毫秒)进行下一次三元组睡眠,以免浪费太多CPU

Utils.class
中似乎有这样一种方法:
Utils.sleep(长毫秒)

但是,在Apache Storm本身提供的一个喷口中,
mqttspoot
,使用了不同的方法:

public void nextTuple() {
    AckableMessage tm = this.incoming.poll();
    if(tm != null){
        ...
    } else {
        Thread.yield();
    }
}
我怀疑Storm的作者可能犯了一个错误,因为
Thread.yield()
本身在文档中有以下注释:

向调度程序发出的提示,表示当前线程愿意使用处理器。调度程序可以随意忽略此提示

使用这种方法很少合适


那么我应该使用哪一个呢?我怀疑使用
Thread.yield()
会导致不必要的CPU使用。

你的嘴根本不应该睡觉。如果您在通话过程中没有发出任何信号,至少在我熟悉的1.0.0和forward版本中,Storm将处理nextTuple的两次通话之间的休眠

请参阅以供参考。等待策略的默认实现在每次调用时休眠一个可配置的间隔(默认1ms)。您可以使用控制间隔,也可以使用完全替代等待策略

Storm 2.0.0将有稍微不同的行为(逐渐延长睡眠时间),但它的基本思想是相同的

我认为javadoc for nextTuple具有误导性,因此我们可能应该修改它。我也不确定
线程.yield
在mqtt喷口中做了什么。它看起来像是在添加喷口后就在那里了。如果你在其中一个邮件列表()上询问,作者仍然在,并且可能知道它为什么在那里


如果您愿意,您可以在上提出问题来解决此问题:)

谢谢您的回答,我想知道,如果没有元组可以发出,为什么Storm会占用CPU,所以这可能只是早期版本或类似版本的工件。