这一节主要是对前面两节所分析的内容的不足的补充,这些补充内容是整个系统通用的部分,搞清楚有利于我们后面系统的分析。对了还有就是发现之前的思维导图中一些失误导致逻辑上有点问题,后面发现了会修改,所以本节开始会附上所有的思维导图,这节的思维导图名称:关于loginapp分析的思考和遗漏技术点补充
好的下面开始了,这节我们主要说到的是四个方面,1.定时器;2.任务队列;3.线程池;4.python模块的加载;
1.定时器:
定时器主要是用来处理系统中,延时性任务,或者定时循环类型任务的,对于一个完整的项目来说是必不可少的,下面我们来看看kbe的定时器是怎么实现的;
首先我们从addTimer()这个方法开始,说出一条执行逻辑,大家就会很清楚,在调用这个方法的时候,系统会把定时器加入到一个定时器队列:
timeQueue_.push( pTime );
这个容器是作者(柯标大大)封装的一个容器,这个容器的主要功能有两个,一个是保存定时器,二是对这些定时器任务排序,其他加入移除等不论,保存就不用多说了,排序主要是利用哈希表来把到达执行时间最短的都放在前面。
后面主要是在模板函数:
int TimersT< TIME_STAMP >::process(TimeStamp now)
这个里面循环去拿出容器的第一个元素来比较其时间是否到达要执行的时间了,如果到达了就取出来执行其:
pTime->triggerTimer();
而在这个方法中调用了保存执行对象的:
handleTimeout( TimerHandle( this ), pUserData_ );
这个方法,所以在给一个对象添加定时器的时候需要实现这个方法,
这样来说大家就清楚了kbe中的定时器的用法和实现方法了吧;
2.任务队列:
任务对列在我们暂时分析的loginapp来说,先给他分为两类,一类就是我们这边说的普通任务对列,通过方法:
this->processOnce(true);
在主循环中调用执行的,还有一种就是下面收到的线程池中的添加调用的,
先看这种普通的,
首先是添加一个任务:
dispatcher.addTask( this );
这个实在dispatcher中添加一个任务,然后在上面说的调用方法中调用方法:
this->processTasks();
然后调用处理对象的
pTasks_->process();
这个方法,由此可以看出在添加普通任务的时候需要实现以下process()方法了;哈哈
3.线程池:
线程池在多线程开发中是常用到的一个组件,其目的是减少线程创建和销毁之间的内核调用用户态和内核态之间的切换所带来的消耗,提高程序运行的效率,其次可以更好的控制线程的运行。
那么我们看看loginapp中我们分析到的线程池的实现逻辑把
createThreadPool()
这个方法创建了一个线程池,才线程池里创建了配置文件配置的线程数量的线程,关于配置参数在前面的章节中有说过,这里不再赘述,下面我们看看线程主要干事的地方,线程处理函数
void* TPThread::threadFunc(void* arg)
线程池里的线程主要是在这个方法里面做事的,看看干事的方法;
tptd->processTask(task);
同样在这个方法下面调用了任务对象的处理方法
pTask->process();
一样也是在process()中处理的。
现在我们看看线程池中的任务是怎么添加的吧,
ThreadPool::_addTask(TPTask* tptask)
原来是调用的这个方法添加的,在这个方法下面有层封装
bool ThreadPool::addTask(TPTask* tptask)
线程池的逻辑就是这样,看是很简单,但实际开发中可不是那么容易,要注意资源的抢占问题,设置临界等等;
4.python模块加载:
python模块的注册加载主要分为两步,
1,if(!installPyScript());
脚本的加载。
2,if(!installPyModules())
注册c++模块到python,
这些大多都是python和c++交互的方法调用,但是柯标大大的设计还是很不错的指的学习;
好了loginapp的分析就大概到这里了后面分析其他模块
思维导图地址:链接:https://pan.baidu.com/s/14PF6Bh5-Ia5qkAwF7m_hcg
提取码:6sgj
复制这段内容后打开百度网盘手机App,操作更方便哦