当前位置: 首页 > news >正文

学校网站建设自检自查报告自己怎样建设淘宝返现网站

学校网站建设自检自查报告,自己怎样建设淘宝返现网站,单位网站建设意义,优质的聊城做网站timer定时器模块 以下是从sylar服务器中学的#xff0c;对其的复习#xff1b; 参考资料 定时器概述 通过定时器可以实现给服务器注册定时事件#xff0c;这是服务器上经常要处理的一类事件#xff0c;比如3秒后关闭一个连接#xff0c;或是定期检测一个客户端的连接状…timer定时器模块 以下是从sylar服务器中学的对其的复习 参考资料 定时器概述 通过定时器可以实现给服务器注册定时事件这是服务器上经常要处理的一类事件比如3秒后关闭一个连接或是定期检测一个客户端的连接状态。 定时事件依赖于Linux提供的定时机制它是驱动定时事件的原动力目前Linux提供了以下几种可供程序利用的定时机制 alarm()或setitimer()这俩的本质都是先设置一个超时时间然后等SIGALARM信号触发通过捕获信号来判断超时套接字超时选项对应SO_RECVTIMEO和SO_SNDTIMEO通过errno来判断超时多路复用超时参数select/poll/epoll都支持设置超时参数通过判断返回值为0来判断超时timer_create系统接口实质也是借助信号参考man 2 timer_createtimerfd_create系列接口通过判断文件描述符可读来判断超时可配合IO多路复用 sylar使用时间堆的方式管理定时器 每次都取出所有定时器中超时时间最小的超时值作为一个tick这样一旦tick触发超时时间最小的定时器必然到期。处理完已超时的定时器后再从剩余的定时器中找出超时时间最小的一个并将这个最小时间作为下一个tick如此反复就可以实现较为精确的定时。 最小堆很适合处理这种定时方案将所有定时器按最小堆来组织可以很方便地获取到当前的最小超时时间sylar采取的即是这种方案。 sylar定时器设计 sylar的定时器采用最小堆设计所有定时器根据绝对的超时时间点进行排序每次取出离当前时间最近的一个超时时间点计算出超时需要等待的时间然后等待超时。超时时间到后获取当前的绝对时间点然后把最小堆里超时时间点小于这个时间点的定时器都收集起来执行它们的回调函数。 关于定时器和IO协程调度器的整合。IO协程调度器的idle协程会在调度器空闲时阻塞在epoll_wait上等待IO事件发生。在之前的代码里epoll_wait具有固定的超时时间这个值是5秒钟。加入定时器功能后epoll_wait的超时时间改用当前定时器的最小超时时间来代替。epoll_wait返回后根据当前的绝对时间把已超时的所有定时器收集起来执行它们的回调函数。 由于epoll_wait的返回并不一定是超时引起的也有可能是IO事件唤醒的所以在epoll_wait返回后不能想当然地假设定时器已经超时了而是要再判断一下定时器有没有超时这时绝对时间的好处就体现出来了通过比较当前的绝对时间和定时器的绝对超时时间就可以确定一个定时器到底有没有超时。 sylar定时器实现 sylar的定时器对应Timer类这个类的成员变量包括定时器的绝对超时时间点是否重复执行回调函数以及一个指向TimerManager的指针提供cancel/reset/refresh方法用于操作定时器。构造Timer时可以传入超时时间也可以直接传入一个绝对时间。Timer的构造函数被定义成私有方式只能通过TimerManager类来创建Timer对象。除此外Timer类还提供了一个仿函数Comparator用于比较两个Timer对象比较的依据是绝对超时时间。 class TimerManager; /*** brief 定时器*/ class Timer : public std::enable_shared_from_thisTimer { friend class TimerManager; public:/// 定时器的智能指针类型typedef std::shared_ptrTimer ptr;/*** brief 取消定时器*/bool cancel();/*** brief 刷新设置定时器的执行时间*/bool refresh();/*** brief 重置定时器时间* param[in] ms 定时器执行间隔时间(毫秒)* param[in] from_now 是否从当前时间开始计算*/bool reset(uint64_t ms, bool from_now); private:/*** brief 构造函数* param[in] ms 定时器执行间隔时间* param[in] cb 回调函数* param[in] recurring 是否循环* param[in] manager 定时器管理器*/Timer(uint64_t ms, std::functionvoid() cb,bool recurring, TimerManager* manager);/*** brief 构造函数* param[in] next 执行的时间戳(毫秒)*/Timer(uint64_t next); private:/// 是否循环定时器bool m_recurring false;/// 执行周期uint64_t m_ms 0;/// 精确的执行时间uint64_t m_next 0;/// 回调函数std::functionvoid() m_cb;/// 定时器管理器TimerManager* m_manager nullptr; private:/*** brief 定时器比较仿函数*/struct Comparator {/*** brief 比较定时器的智能指针的大小(按执行时间排序)* param[in] lhs 定时器智能指针* param[in] rhs 定时器智能指针*/bool operator()(const Timer::ptr lhs, const Timer::ptr rhs) const;}; };所有的Timer对象都由TimerManager类进行管理TimerManager包含一个std::set类型的Timer集合这个集合就是定时器的最小堆结构因为set里的元素总是排序过的所以总是可以很方便地获取到当前的最小定时器。TimerManager提供创建定时器获取最近一个定时器的超时时间以及获取全部已经超时的定时器回调函数的方法并且提供了一个onTimerInsertedAtFront()方法这是一个虚函数由IOManager继承时实现当新的定时器插入到Timer集合的首部时TimerManager通过该方法来通知IOManager立刻更新当前的epoll_wait超时。TimerManager还负责检测是否发生了校时由detectClockRollover方法实现。 /*** brief 定时器管理器*/ class TimerManager { friend class Timer; public:/// 读写锁类型typedef RWMutex RWMutexType;/*** brief 构造函数*/TimerManager();/*** brief 析构函数*/virtual ~TimerManager();/*** brief 添加定时器* param[in] ms 定时器执行间隔时间* param[in] cb 定时器回调函数* param[in] recurring 是否循环定时器*/Timer::ptr addTimer(uint64_t ms, std::functionvoid() cb,bool recurring false);/*** brief 添加条件定时器* param[in] ms 定时器执行间隔时间* param[in] cb 定时器回调函数* param[in] weak_cond 条件* param[in] recurring 是否循环*/Timer::ptr addConditionTimer(uint64_t ms, std::functionvoid() cb,std::weak_ptrvoid weak_cond,bool recurring false);/*** brief 到最近一个定时器执行的时间间隔(毫秒)*/uint64_t getNextTimer();/*** brief 获取需要执行的定时器的回调函数列表* param[out] cbs 回调函数数组*/void listExpiredCb(std::vectorstd::functionvoid() cbs);/*** brief 是否有定时器*/bool hasTimer(); protected:/*** brief 当有新的定时器插入到定时器的首部,执行该函数*/virtual void onTimerInsertedAtFront() 0;/*** brief 将定时器添加到管理器中*/void addTimer(Timer::ptr val, RWMutexType::WriteLock lock); private:/*** brief 检测服务器时间是否被调后了*/bool detectClockRollover(uint64_t now_ms); private:/// MutexRWMutexType m_mutex;/// 定时器集合std::setTimer::ptr, Timer::Comparator m_timers;/// 是否触发onTimerInsertedAtFrontbool m_tickled false;/// 上次执行时间uint64_t m_previouseTime 0; };IOManager通过继承的方式获得TimerManager类的所有方法这种方式相当于给IOManager外挂了一个定时器管理模块。为支持定时器功能需要重新改造idle协程的实现epoll_wait应该根据下一个定时器的超时时间来设置超时参数。 class IOManager : public Scheduler, public TimerManager { ... }void IOManager::idle() {SYLAR_LOG_DEBUG(g_logger) idle;// 一次epoll_wait最多检测256个就绪事件如果就绪事件超过了这个数那么会在下轮epoll_wati继续处理const uint64_t MAX_EVNETS 256;epoll_event *events new epoll_event[MAX_EVNETS]();std::shared_ptrepoll_event shared_events(events, [](epoll_event *ptr) {delete[] ptr;});while (true) {// 获取下一个定时器的超时时间顺便判断调度器是否停止uint64_t next_timeout 0;if( SYLAR_UNLIKELY(stopping(next_timeout))) {SYLAR_LOG_DEBUG(g_logger) name getName() idle stopping exit;break;}// 阻塞在epoll_wait上等待事件发生或定时器超时int rt 0;do{// 默认超时时间5秒如果下一个定时器的超时时间大于5秒仍以5秒来计算超时避免定时器超时时间太大时epoll_wait一直阻塞static const int MAX_TIMEOUT 5000;if(next_timeout ! ~0ull) {next_timeout std::min((int)next_timeout, MAX_TIMEOUT);} else {next_timeout MAX_TIMEOUT;}rt epoll_wait(m_epfd, events, MAX_EVNETS, (int)next_timeout);if(rt 0 errno EINTR) {continue;} else {break;}} while(true);// 收集所有已超时的定时器执行回调函数std::vectorstd::functionvoid() cbs;listExpiredCb(cbs);if(!cbs.empty()) {for(const auto cb : cbs) {schedule(cb);}cbs.clear();}...
http://www.zqtcl.cn/news/366307/

相关文章:

  • 网站开发怎么报价推广普通话手抄报模板可打印
  • 好的平面网站模板企业网站建设浩森宇特
  • 做网站通过什么赚钱吗公司建设网站的费用
  • 如何做建筑一体化的网站视频网站开发应用到哪些技术
  • 巴中微信网站建设竞价托管一般多少钱
  • 彩票网站开发 违法股票网站排名哪个好
  • 宝格丽网站建设哈尔滨网站建设王道下拉強
  • 烟台网站建设的公司世界500强企业排名2021
  • 网络营销做得比较成功的案例吴中seo网站优化软件
  • 怎么设立网站美区下载的app怎么更新
  • 建立网站ppt做酒店网站所用到的算法
  • 上海网站建设的价格低太仓做网站的公司
  • 怎样登录建设互联网站怎么做中英文网站
  • 云网站7china中小企业网站建设好么
  • 美丽南方官网网站建设国际新闻最新消息今天摘抄
  • 牛商网营销型网站多少钱江门营销型网站建设多少钱
  • 小榄公司网站建设网站交互做的比较好的
  • 深圳定制网站建设怎么改版网站
  • 免费学软件的自学网站江阴建设局网站
  • 网站做多久苍南县网站集约化建设
  • 深圳电子烟网站建设罗湖建设公司网站建设
  • 酒店 深圳 网站建设新项目首码对接平台
  • 岳阳市住房和城乡建设局网站上海专业网站建设网
  • 营销型网站建设设定包括哪些方面网站建设后的心得
  • 建立网站来网上销售的英文潢川城乡建设局网站
  • 仿站建站教程网站怎么接广告
  • 免费下载代码项目的网站长春网站建设找新生科技
  • 博兴县建设局网站做网站要用什么服务器吗
  • 成都中小企业网站建设公司怎么挑选网站建设公司
  • 万源网站建设在ppt里面做网站链接