【发布时间】:2018-07-17 12:55:11
【问题描述】:
nextTuple() 的 Storm 文档说明如下:
当没有要发出的元组时,最好让 nextTuple 休眠一小段时间(比如一毫秒),以免浪费太多 CPU。
Utils.class 中似乎有一种方法:Utils.sleep(long millis)。
但是,在 Apache Storm 本身提供的一个 spout 中,MqttSpout 使用了不同的方法:
public void nextTuple() {
AckableMessage tm = this.incoming.poll();
if(tm != null){
...
} else {
Thread.yield();
}
}
我怀疑 Storm 作者可能在那里犯了一个错误,因为 Thread.yield() 本身在文档中有以下注释:
向调度程序提示当前线程愿意让出其当前使用的处理器。调度程序可以随意忽略此提示。
和
这种方法很少适用。
那么我应该使用哪一个?我怀疑使用 Thread.yield() 会导致不必要的 CPU 使用。
【问题讨论】:
标签: concurrency apache-storm thread-sleep