而且原来的实现中electionTimeOutTicker()不会判断自己的身份,会狠狠的一直执行,哪怕是一直不断sleep也好。
定时器还有一个缺点,因为原来已经采用了thread的写法,那么如果改成采用定时器,肯定就不能sleep了,那么就需要在sleep的时候改成在定时器里面添加定时任务,而且sleep的前后部分就必须额外封装成其他的函数(否则无法成task传给定时器去处理)。经过分析,可以发现在考虑原有代码的基础上,改写成定时器的工作量还是比较大的,而且改写之后易读性就没那么强了(个人认为原来的代码性能很垃,但是简单,一看就懂)。
在C++标准库中直接hook std::this_thread::sleep_for是不可行的,因为C++标准库的实现通常是由编译器提供的,而且C++标准库的行为是由C++标准规定的感觉好处远远大于坏处,那么就动手吧。
因此只有libc里面的这些函数才能正常的hook
后文中的协程库特指上面链接中的这个库,其他库的特性可能有不同的地方。在引入的时候如上面所述,我们必须要考虑不同任务之间的影响,尤其是raft中对于定时时间要求是ms级别的。
红色部分表示hook成功,将usleep改位定时器任务。发生选举再集合上面的日志表现,那么肯定是leader发送不成功。
无法保证定时精度这点在学习协程的时候就感觉到了,但是真的踩坑了才理会到真意。其他收获
关于异步和同步,这里让我想到了线程池中的快慢线程分离的操作,本质上是防止慢命令线程阻塞快命令线程从而影响QPS。
本文由博客一文多发平台 OpenWrite 发布!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |