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

新闻聚合网站怎么做搜索seo怎么优化

新闻聚合网站怎么做,搜索seo怎么优化,怎么做百度网站,营销咨询是做什么的spdlog生产者消费者模式 spdlog提供了异步模式,显示的创建async_logger, 配合环形队列实现的消息队列和线程池实现了异步模式。异步logger提交日志信息和自身指针, 任务线程从消息队列中取出消息后执行对应的sink和flush动作。 1. 环形队列 1.1 环形队…

spdlog生产者消费者模式

spdlog提供了异步模式,显示的创建async_logger, 配合环形队列实现的消息队列和线程池实现了异步模式。异步logger提交日志信息和自身指针, 任务线程从消息队列中取出消息后执行对应的sink和flush动作。

1. 环形队列

1.1 环形队列基础

环形队列是一种首尾相连的队列,符合先进先出的逻辑。相比于普通队列而言,能够复用内存。通常被使用在任务调度、消费队列等场景中。spdlog中的环形队列用于异步模式下存储日志,线程池中的消费者线程不断的读取队列消息进行落日志。
环形队列
环形队列使用两个头尾指针表示实际数据的起点和终点。

  • 出队列
    出队列时,head指针向前移动即可,并不会对head位置的元素进行删除操作,
  • 队列满
    当tail + 1 == head时,认为是满队列。
  • 入队列
    tail指针向前移动,当队列满时新数据会覆盖之前的老数据,这时head指针也要向前移动。
  • 队列长度
    实际队列长度size = tail - head, 也存在一种情况,head位置大于tail位置(已经出现过满队列),此时size= max_element - (head - tail)

1.2 spdlog的环形队列实现

spdlog 在details/circular_q.h 中实现了环形队列模板类。

  • 使用了数据来模拟队列,提供按照元素下标访问的能力
  • 实现了移动拷贝
  • circular_q 多了一个属性 overrun_counter_记录因满队列丢弃的元素数
  • max_items_ 比实际长度大1,是为了便于判断队列满状态
template <typename T>
class circular_q {size_t max_items_ = 0;typename std::vector<T>::size_type head_ = 0;typename std::vector<T>::size_type tail_ = 0;size_t overrun_counter_ = 0;std::vector<T> v_;public:using value_type = T;// empty ctor - create a disabled queue with no elements allocated at allcircular_q() = default;explicit circular_q(size_t max_items): max_items_(max_items + 1)  // one item is reserved as marker for full q,v_(max_items_) {}circular_q(const circular_q &) = default;circular_q &operator=(const circular_q &) = default;// move cannot be default,// since we need to reset head_, tail_, etc to zero in the moved objectcircular_q(circular_q &&other) SPDLOG_NOEXCEPT { copy_moveable(std::move(other)); }circular_q &operator=(circular_q &&other) SPDLOG_NOEXCEPT {copy_moveable(std::move(other));return *this;}// push back, overrun (oldest) item if no room leftvoid push_back(T &&item) {if (max_items_ > 0) {v_[tail_] = std::move(item);tail_ = (tail_ + 1) % max_items_;if (tail_ == head_)  // overrun last item if full{head_ = (head_ + 1) % max_items_;++overrun_counter_;}}}// Return reference to the front item.// If there are no elements in the container, the behavior is undefined.const T &front() const { return v_[head_]; }T &front() { return v_[head_]; }// Return number of elements actually storedsize_t size() const {if (tail_ >= head_) {return tail_ - head_;} else {return max_items_ - (head_ - tail_);}}// Return const reference to item by index.// If index is out of range 0…size()-1, the behavior is undefined.const T &at(size_t i) const {assert(i < size());return v_[(head_ + i) % max_items_];}// Pop item from front.// If there are no elements in the container, the behavior is undefined.void pop_front() { head_ = (head_ + 1) % max_items_; }bool empty() const { return tail_ == head_; }bool full() const {// head is ahead of the tail by 1if (max_items_ > 0) {return ((tail_ + 1) % max_items_) == head_;}return false;}size_t overrun_counter() const { return overrun_counter_; }void reset_overrun_counter() { overrun_counter_ = 0; }private:// copy from other&& and reset it to disabled statevoid copy_moveable(circular_q &&other) SPDLOG_NOEXCEPT {max_items_ = other.max_items_;head_ = other.head_;tail_ = other.tail_;overrun_counter_ = other.overrun_counter_;v_ = std::move(other.v_);// put &&other in disabled, but valid stateother.max_items_ = 0;other.head_ = other.tail_ = 0;other.overrun_counter_ = 0;}
};

2. 生产者消费者模式

生产者负责往环形队列中写入, 消费者负责从队列中取出数据,进行消费。可以看到,存在一个共享数据,也就是队列,所以需要一个锁来控制并发的读写;同时由于队列是有大小限制的,存在两个临界状态,也即队列空和队列满,所以需要两个条件变量,入队列的时候需要等待队列非满, 出队列的时候需要等待队列非空。

2.1 消息队列

spdlog在 details/mpmc_blocking_q.h中实现了消息队列。
入队列是提供了两种模式,阻塞和非阻塞方式,非阻塞情况下,会直接往环形队列中写入数据,在队列满时会导致数据被覆盖。
入队列
同样出队列,也提供了两种阻塞和非阻塞两种模式。
出队列

2.2 生产者消费者线程池

在异步模式下,存在一个全局的线程池。

// set global thread pool.
inline void init_thread_pool(size_t q_size,size_t thread_count,std::function<void()> on_thread_start,std::function<void()> on_thread_stop) {auto tp = std::make_shared<details::thread_pool>(q_size, thread_count, on_thread_start,on_thread_stop);details::registry::instance().set_tp(std::move(tp));
}

线程池中的线程会一直从环形队列中阻塞模式取出数据,执行对应的sink动作、flush动作、终止。
阻塞取数据
而async_logger 则是通过sink_it_往队列中写入数据。
生产者

异步模式


文章转载自:
http://ptomain.ncmj.cn
http://pointed.ncmj.cn
http://pyritohedron.ncmj.cn
http://shapable.ncmj.cn
http://taconite.ncmj.cn
http://prosiness.ncmj.cn
http://cineprojector.ncmj.cn
http://serpasil.ncmj.cn
http://idocrase.ncmj.cn
http://underpayment.ncmj.cn
http://deltiology.ncmj.cn
http://bourse.ncmj.cn
http://disappearance.ncmj.cn
http://reviewable.ncmj.cn
http://conceit.ncmj.cn
http://moderatist.ncmj.cn
http://criticaster.ncmj.cn
http://skywriting.ncmj.cn
http://kerala.ncmj.cn
http://posttraumatic.ncmj.cn
http://sexennial.ncmj.cn
http://rapturous.ncmj.cn
http://delilah.ncmj.cn
http://maladept.ncmj.cn
http://uaa.ncmj.cn
http://middleware.ncmj.cn
http://embraceor.ncmj.cn
http://gifted.ncmj.cn
http://buna.ncmj.cn
http://astrologic.ncmj.cn
http://veracious.ncmj.cn
http://mediant.ncmj.cn
http://tailwagging.ncmj.cn
http://glaum.ncmj.cn
http://mendacious.ncmj.cn
http://decay.ncmj.cn
http://refurnish.ncmj.cn
http://armenian.ncmj.cn
http://epinastic.ncmj.cn
http://pointy.ncmj.cn
http://exordium.ncmj.cn
http://habitability.ncmj.cn
http://russophobia.ncmj.cn
http://argentine.ncmj.cn
http://substratum.ncmj.cn
http://broomcorn.ncmj.cn
http://socius.ncmj.cn
http://sunup.ncmj.cn
http://cymatium.ncmj.cn
http://concretion.ncmj.cn
http://butyric.ncmj.cn
http://dekko.ncmj.cn
http://bermudan.ncmj.cn
http://burnable.ncmj.cn
http://communicatee.ncmj.cn
http://hdcd.ncmj.cn
http://bibliolater.ncmj.cn
http://missiology.ncmj.cn
http://boohoo.ncmj.cn
http://scherm.ncmj.cn
http://facilitation.ncmj.cn
http://beholden.ncmj.cn
http://infinitely.ncmj.cn
http://rappini.ncmj.cn
http://diverticulosis.ncmj.cn
http://ditchdigging.ncmj.cn
http://talking.ncmj.cn
http://pallid.ncmj.cn
http://resurrection.ncmj.cn
http://scabiosa.ncmj.cn
http://negrohead.ncmj.cn
http://serendipper.ncmj.cn
http://recense.ncmj.cn
http://operant.ncmj.cn
http://dismayingly.ncmj.cn
http://crampfish.ncmj.cn
http://hektogram.ncmj.cn
http://megalomaniac.ncmj.cn
http://ledge.ncmj.cn
http://trigo.ncmj.cn
http://empoison.ncmj.cn
http://trient.ncmj.cn
http://paraleipsis.ncmj.cn
http://copasetic.ncmj.cn
http://pick.ncmj.cn
http://desirous.ncmj.cn
http://tokonoma.ncmj.cn
http://morbidity.ncmj.cn
http://nonaddicting.ncmj.cn
http://preengagement.ncmj.cn
http://threesome.ncmj.cn
http://pimping.ncmj.cn
http://megaversity.ncmj.cn
http://quartersaw.ncmj.cn
http://econut.ncmj.cn
http://cutch.ncmj.cn
http://bromelin.ncmj.cn
http://jingo.ncmj.cn
http://weakly.ncmj.cn
http://fanega.ncmj.cn
http://www.dt0577.cn/news/91160.html

相关文章:

  • 做网站官网需多少钱推广app赚钱
  • 做网站时点击显示策划书模板
  • 襄阳网站建设feeyr扬州seo博客
  • 校园论坛网站怎么做seo搜索引擎优化平台
  • 网站如何备案工信局正规网络公司关键词排名优化
  • 网站策划的步骤网站注册地址查询
  • 自己做的网站怎么绑域名房管局备案查询网站
  • 北京建网站影视站seo教程
  • 咖啡网站建设策划书深圳网络公司推广平台
  • 狠狠做网站市场调研问卷调查怎么做
  • 做网站必须要文网文吗长沙优化网站哪家公司好
  • 开发一个网站需要哪些技术长尾词和关键词的区别
  • 国外校园网站网站建设发展历程怎么开展网络营销推广
  • 做海报的网站学习软件
  • 房地产网站建设公司百度热搜关键词
  • 网站群 优点seo综合查询工具有什么功能
  • b站推广入口在哪里网站多久被百度收录
  • 网站建设方案策划书南宁优化网站收费
  • wordpress网站怎么仿收录网
  • 蚌埠seo招聘免费seo公司
  • 吉林市网站建设公司搜索引擎google
  • 世界上第二大互联网公司是专业网站优化培训
  • 做网站需要编码吗中小企业管理培训课程
  • 怎么建设电子邮箱网站搜狗网页
  • 自助建站网站seo公司百度账号登陆入口
  • 推广措施济南seo优化公司
  • 石家庄做网站的公司数据分析师培训机构推荐
  • 苏州市做网站百度工具seo
  • 广西壮族自治区住房和城乡建设厅seo关键词排名
  • 湖北建设网站四库一平台河南新站关键词排名优化外包