为什么visualvm中的cpu配置文件显示,当使用clojure的core async读取kafka流时,进程将所有时间都花费在promise deref中

g9icjywg  于 2021-06-09  发布在  Kafka
关注(0)|答案(1)|浏览(281)

我正在运行一个clojure应用程序,从kaka流读取数据。我正在使用github项目https://github.com/l1x/shovel 读Kafka的作品。当我使用visualvm分析我的应用程序寻找热点时,我注意到大约70%的cpu时间都花在clojure.core$promise$reify\uu6310.deref函数上。
铲子api使用者是kafka consumergroup api上的ThinRapper。它读取kafka主题并发布到核心异步通道。如果我继续使用这个api,我应该担心我的应用程序延迟会受到影响。有什么解释为什么承诺上的具体化占用了这么多cpu时间。

rkue9o1l

rkue9o1l1#

在clojure, $ 在类的打印表示中用于表示内部类。 clojure.core$promise$reify__6310.deref 意味着调用方法 deref 在通过 reify 作为一个内部阶级 clojure.core/promise . 事实证明,如果你看看 promise ,它将显示为内部物化类 clojure.core$promise .
promise 在clojure中,表示可能还不可用的数据。您可以在repl中看到它的行为:

user> (def p (promise))

# 'user/p

user> (class p)
clojure.core$promise$reify__6363
user> (deref p)

这将挂起并且不给出任何结果,并且不会给出下一个repl提示,直到您 deliver 或中断 deref 打电话。时间被花在 derefpromise 简单地说,程序逻辑正在等待尚未计算(或尚未通过网络等)的值。

相关问题