为什么在 zookeeper WorkerSender 中使用 poll() 而不是 take()
Why use poll() instead of take() in zookeeper WorkerSender
我一直在阅读 zookeeper 源代码,发现当从 FastLeaderElection.WorkerSender
中的队列中获取 ToSend
消息时,他们使用 poll()
而不是 take()
。为什么?
poll()
更好吗?
搜索 git 历史,我发现它开始使用 take()
,所以必须有一个原因更改为 poll()
。
public void run() {
while (!stop) {
try {
ToSend m = sendqueue.poll(3000, TimeUnit.MILLISECONDS);
if (m == null) {
continue;
}
process(m);
} catch (InterruptedException e) {
break;
}
}
LOG.info("WorkerSender is down");
}
TL;DR: 检查停止标志。
为 ZOOKEEPER-498: Diff of FastLeaderElection.java
所做的更改
旧代码:
class WorkerReceiver implements Runnable {
QuorumCnxManager manager;
WorkerReceiver(QuorumCnxManager manager) {
this.manager = manager;
}
public void run() {
Message response;
while (true) {
// Sleeps on receive
try{
response = manager.recvQueue.take();
// Receive new message
LOG.debug("Receive new message.");
新代码:
class WorkerReceiver implements Runnable {
volatile boolean stop;
QuorumCnxManager manager;
WorkerReceiver(QuorumCnxManager manager) {
this.stop = false;
this.manager = manager;
}
public void run() {
Message response;
while (!stop) {
// Sleeps on receive
try{
response = manager.recvQueue.poll(3000, TimeUnit.MILLISECONDS);
if(response == null) continue;
// Receive new message
LOG.debug("Receive new message.");
they use poll()
instead of take()
. Why ?
因此他们可以每 3 秒检查一次 新 stop
标志。
我一直在阅读 zookeeper 源代码,发现当从 FastLeaderElection.WorkerSender
中的队列中获取 ToSend
消息时,他们使用 poll()
而不是 take()
。为什么?
poll()
更好吗?
搜索 git 历史,我发现它开始使用 take()
,所以必须有一个原因更改为 poll()
。
public void run() {
while (!stop) {
try {
ToSend m = sendqueue.poll(3000, TimeUnit.MILLISECONDS);
if (m == null) {
continue;
}
process(m);
} catch (InterruptedException e) {
break;
}
}
LOG.info("WorkerSender is down");
}
TL;DR: 检查停止标志。
为 ZOOKEEPER-498: Diff of FastLeaderElection.java
旧代码:
class WorkerReceiver implements Runnable {
QuorumCnxManager manager;
WorkerReceiver(QuorumCnxManager manager) {
this.manager = manager;
}
public void run() {
Message response;
while (true) {
// Sleeps on receive
try{
response = manager.recvQueue.take();
// Receive new message
LOG.debug("Receive new message.");
新代码:
class WorkerReceiver implements Runnable {
volatile boolean stop;
QuorumCnxManager manager;
WorkerReceiver(QuorumCnxManager manager) {
this.stop = false;
this.manager = manager;
}
public void run() {
Message response;
while (!stop) {
// Sleeps on receive
try{
response = manager.recvQueue.poll(3000, TimeUnit.MILLISECONDS);
if(response == null) continue;
// Receive new message
LOG.debug("Receive new message.");
they use
poll()
instead oftake()
. Why ?
因此他们可以每 3 秒检查一次 新 stop
标志。