多线程并发检测触发器触发算法优化,附详细代码 - 定时执行专家

news2024/11/26 16:49:15

目录

◆ V6.5版之前的并行检测方案

◆ V6.5版之前的并行检测方案存在的问题

◆ V6.5版本的并行检测方案

◆ 定时执行专家 - 简介

◆ 定时执行专家 - 最新版下载


一些用户说任务数量可能达到200个,让我比较惊讶,这个软件的设计之初并没有考虑这么多的任务数量。考虑这个用户的需求,我重新调整了检测触发器触发的多线程并发的算法。具体算法调整细节本文详细解释如下。

◆ V6.5版之前的并行检测方案

按照12种【触发器类型】创建 12个检测线程,每个线程负责一种触发器类型的触发检测。

触发器类型触发检测线程
倒计时CheckTriggerFireThread_1
伴随软件启动CheckTriggerFireThread_2
空闲时间 CheckTriggerFireThread_3
间隔时间CheckTriggerFireThread_4
具体时间CheckTriggerFireThread_5
每分钟CheckTriggerFireThread_6
每小时CheckTriggerFireThread_7
每天CheckTriggerFireThread_8
每周CheckTriggerFireThread_9
每月CheckTriggerFireThread_10
每年CheckTriggerFireThread_11
Cron表达式CheckTriggerFireThread_12

(表1,按照触发器种类,划分12个线程并发检查各类型触发器的触发条件)

按照触发器种类创建线程代码:

// start check firetime thread by trigger type

for (size_t i = 0; i< N_COUNT_TRIGGER_TYPE ; i++)
{
	CheckTriggerFireThread* pworkerthread = new CheckTriggerFireThread(this, (NTriggerType)i);

	if ( pworkerthread->Create() != wxTHREAD_NO_ERROR)
	{
		wxLogError(_("Can't create thread!"), _("Timing Executor"));
		return;
	}
	if ( pworkerthread->Run() != wxTHREAD_NO_ERROR )
	{
		wxLogError(_T("Can't start thread!"), _("Timing Executor"));
		return;
	}

	wxLogMessage(_T("%d ### CheckFireTimeThread[ThreadID_%zd]: %s Start >>>>>>"), wxDateTime::UNow().GetMillisecond(), (unsigned long long)pworkerthread->GetId(), Trigger::GetTypeNameByNTriggerType((NTriggerType)i));
}

◆ V6.5版之前的并行检测方案存在的问题

按照上面的并行检测方式,有一个问题是因为每个触发器类型的触发器数量分布不均匀,会导致检测效率比较低的现象,有的检测线程检测着很多触发器非常忙,有的线程很空闲。尤其在触发器数量比较多(比如:200个),并且数量集中在某几个触发器类型的时候。

◆ V6.5版本的并行检测方案

划定 6个触发器数量的区间,按照以下规则,创建线程数量和每个线程检测的触发器数量。触发器总数越多,创建的线程越多,每个线程检测的触发器数量也越多。

触发器数量区间代码:

//                                                        CountRange    ThreadCount     Every thread check trigger count
static const size_t N_TRIGGER_COUNT_RANGE_16    = 16;   //   0 ~  15,   4,              4,  90% user will in this range
static const size_t N_TRIGGER_COUNT_RANGE_32    = 32;   //  16 ~  31,   8,              4,
static const size_t N_TRIGGER_COUNT_RANGE_64    = 64;   //  32 ~  63,   8,              8,
static const size_t N_TRIGGER_COUNT_RANGE_128   = 128;  //  64 ~ 127,   16,             8,
static const size_t N_TRIGGER_COUNT_RANGE_256   = 256;  // 128 ~ 256,   16,             16,

触发器数量区间(TriggerCountRange)检测线程数量(ThreadCount)每个检测线程检测触发(CheckTriggerCount)检测线程Index范围(ThreadIndex)
0 ~ 15440 ~ 3
16 ~ 31840 ~ 3
32 ~ 63880 ~ 7
64 ~ 1271680 ~ 7
128 ~ 25616160 ~ 15
257 ~1616+0 ~ 15

(表2,划定 6个触发器数量的区间,根据触发器总数确定线程数量、每个线程检测的触发器数量)

// start check firetime thread by thread index

for (size_t i = 0; i< nThreadCnt; i++)
{
	CheckTriggerFireThreadEx* pworkerthread = new CheckTriggerFireThreadEx(this, nThreadCnt, i);  // triggerid%nThreadCnt = i then check

	if ( pworkerthread->Create() != wxTHREAD_NO_ERROR)
	{
		wxLogError(_("Can't create thread!"), _("Timing Executor"));
		return;
	}
	if ( pworkerthread->Run() != wxTHREAD_NO_ERROR )
	{
		wxLogError(_T("Can't start thread!"), _("Timing Executor"));
		return;
	}

	wxLogMessage(_T("%d ### CheckTriggerFireThreadEx[ThreadID_%zd, nThreadCnt_%zd, nThreadIdx_%zd, nCheckTriggerCnt_%zd] Start >>>>>>"), wxDateTime::UNow().GetMillisecond(), (unsigned long long)pworkerthread->GetId(), nThreadCnt, i, nCheckTriggerCnt);
}
  • 检测算法:每个检测线程设置一个索引(ThreadIndex),按照区间最大值除以每个线程检测触发器数量(CheckTriggerCount)得到需要创建的线程数量(ThreadCount)。在检测线程里面,取得每个触发器的ID值除以线程索引(ThreadIndex)的余数,如果余数等于检测线程的索引值(ThreadIndex),就检测该触发器是否可以触发。
  • 效果:每个检测线程需要检测的触发器数量比较平均,即使触发器总数达到 200以上,也会有不错的检测和触发效率。

◆ 定时执行专家 - 简介

制作精良、功能强大、毫秒精度、专业级的定时任务执行软件。软件具有 23 种【任务类型】、12 种【触发器】触发方式,并且全面支持界面化【Cron表达式】设置软件采用多线程并发方式检测任务触发和任务执行,能够达到毫秒级的执行精度,可以同时支持50个以上任务的毫秒级触发。

(图1,定时执行专家 - 主界面)

◆ 定时执行专家 - 最新版下载

BoomWorks软件的最新版本_boomworks的博客-CSDN博客_boomworks

-- End -- 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL调优-SQL底层执行原理

目录 MySQL调优-SQL底层执行原理 MySQL内部组件结构 Server层 Store层 连接器 客户端连接mysql数据库 创建新用户并且修改用户密码&#xff1a; show processlist 查看用户状态 客户端自动断开时间 长连接和短连接 查询缓存 常见的一些命令操作 大多数情况查询缓存…

Linux使用gdb定位Qt程序崩溃位置(systemd-coredump)

Linux提供了systemd-coredump服务&#xff0c;可以配合gdb来定位到程序崩溃位置&#xff0c;下面介绍它们的用法。 1. systemd-coredump systemd-coredump的简单介绍&#xff1a; systemd-coredump能从操作系统内核中获取内存转储&#xff0c;并能对获取到的数据进行各种处理…

Polygon zkEVM测试集——创建合约交易

1. 引言 可通过https://www.evm.codes/playground&#xff0c;来深入理解EVM各opcode中stack、memory、storage之间的关系&#xff0c;可输入任意的opcode来观察变化。 很赞的资料集&#xff1a; 深入理解合约升级(2) - Solidity 内存布局深入理解 EVM&#xff08;一&#xf…

力扣:两数之和与n数之和的(Map)与(排序+双指针)解法 【三刷终于明白HashMap求和的去重问题】

啃一本算法书啃了快一年了&#xff0c;用嘴想一想都该只剩渣了&#xff0c;脑子是怎么想的&#xff1f;&#xff1f;&#xff1f; 真希望有一天“爷啃完了&#xff0c;爷不要你了&#xff0c;爷换一本啃”&#xff0c;&#xff0c;欸欸欸&#xff1f;&#xff1f;罪过罪过&…

Python基础(一)

Python 的种类 CpythonPython的官方版本&#xff0c;使用C语言实现&#xff0c;使用最为广泛&#xff0c;CPython实现会将源文件&#xff08;py文件&#xff09;转换成字节码文件&#xff08;pyc文件&#xff09;&#xff0c;然后运行在Python虚拟机上。 JyhtonPython的Java实…

IDEA初始化git+代码提交

IDEA初始化git 当你在代码仓库如&#xff1a;github or gitee 上建立好了仓库&#xff0c;我们在idea中该如何初始化你的git又怎么样把你的代码push到代码仓库上呢&#xff1f; 第一步&#xff1a;初始化idea中的git 在idea中的setting中搜索git&#xff0c;将你的git.exe路…

JVM垃圾回收器-评估GC的性能指标

文章目录学习资料垃圾回收器概述评估GC的性能指标吞吐量&#xff08;throughput&#xff09;暂停时间&#xff08;pause time&#xff09;吞吐量VS暂停时间学习资料 【尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟机&#xff09;】 【阿里巴巴Java开发手册】https://www.…

机器学习 加利福尼亚房价预测

学习目标&#xff1a; 提示&#xff1a;导入包 例如&#xff1a; import pandas as pd import numpy as npfrom sklearn.datasets import fetch_california_housing from sklearn.model_selection import KFold, train_test_split from sklearn.metrics import mean_squared…

【阶段二】Python数据分析Pandas工具使用02篇:数据读取:文本文件读取、电子表格读取与数据预处理:数据概览与清洗

本篇的思维导图: 数据读取:文本文件读取 对于csv后缀的文本文件,可以使用pandas模块中的read_csv函数进行读取。 所需要的数据文件如下百度云盘链接: 链接:https://pan.baidu.com/s/1Zj-uTt_wdRcmDt3aumZ2nA 提取码:z2e8 代码

CSRF攻防基础讲解

CSRF攻击 Cross-site request forgery跨站请求伪造 场景模拟 在用户登录某个网站后&#xff0c;看到某篇文章高兴之余&#xff0c;挥手打字&#xff0c;突然有人发来一个链接&#xff0c;登录者打开链接后什么都没有操作或者只是好奇的点击了某个按钮&#xff0c;在原登录网…

猿客栈后台管理系统日志记录

目录 一、用户权限设置 前端逻辑 后端逻辑 二、登录界面逻辑 1、账号密码登录实现 前端逻辑 在Cookie中存储token的方法 在Cookie中存储和获取的token方法 后端逻辑 生成token工具类 2、手机号登录 前台逻辑 后台逻辑 补充&#xff1a;实现点击发送验证码120s倒计…

ThinkPHP 之 SQLI审计分析(二)

说明 该文章来源于同事lu2ker转载至此处&#xff0c;更多文章可参考&#xff1a;https://github.com/lu2ker/ 文章目录说明0x00 测试代码做了什么&#xff1f;0x01 分析调用0x02 漏洞点的发现、构造、利用0x03 总结Time&#xff1a;9-3影响版本&#xff1a;ThinkPHP5.0.10 Pa…

详细介绍chrony服务器

chrony服务器 硬件时间&#xff1a;BIOS里面&#xff1b;关机后依然运行&#xff0c;主板电池为它供电&#xff1b;RTC时钟 系统时间&#xff1a;开机后&#xff0c;软件启动读取硬件时钟&#xff0c;之后独立运行 Chrony 的配置文件是/etc/chrony.conf chronyd服务器端 ch…

【目标检测】Mask rcnn代码实现Pytorch版,适用30系列显卡!(测试版)

目录&#xff1a;Mask rcnn代码实现Pytorch版一、环境二、mmdetection环境搭建三、测试四、结果展示为什么选择使用Pytorch版本&#xff1f;因为本人换电脑了&#xff0c;显卡升级为30系列&#xff0c;而30系列显卡的 CUDA 版本要求是 11.x。一、环境 cudatoolkit …

MYSQL之两阶段提交和组提交(数据一致性)

我们在MySQL 的日志中详细的介绍了undo log、redo log、binlog这三个日志和所用到的一些缓存知识&#xff0c;那么下面我们分析一下更新语句执行过程&#xff0c;它们是怎么变化的呢&#xff1f;下面我们直接给答案吧。假如我们修改一行主键索引&#xff08;id&#xff09;为1的…

电力系统激励型需求响应+自适应多群体优化算法(Python实现)

目录 ​编辑 0 前言 1 激励型DR和价格型DR 2 激励型DR模型 3 Python代码实现 4 自适应多群体优化算法&#xff08;AMPO&#xff09; 5 Python代码实现 0 前言 风、光等清洁能源因具有环保、资源丰富等优点而受到电力行业的重视,电力行业开始大力发展清洁能源发电。同时…

MySQL详解,库和表的基础操作

目录 前言 一、预备知识 1、服务器&#xff0c;数据库&#xff0c;表关系 2、SQL分类 3、连接服务器 二、库的操作 1、创建数据库 2、查看字符集和校验规则 2.1 查看系统默认字符集以及校验规则 2.2 查看数据库支持的字符集和字符集校验规则 3、操纵数据库 3.1查看…

ros tf坐标

参考&#xff1a; 讲解&#xff1a;https://www.bilibili.com/video/BV1zt411G7Vn/?p18&vd_source3a1ad336af3eaae4fcced56c75d309d1ROS程序&#xff1a;https://gitee.com/guyuehome/ros_21_tutorials/tree/master/learning_tfROS2程序&#xff1a;https://gitee.com/gu…

公司企业兔年祝福元旦祝福贺卡邀请函模板!

能群发的贺卡邀请函如何制作&#xff1f;想制作一个专属的祝福贺卡邀请函有什么方法&#xff1f;下面跟着小编的乔拓云工具教程&#xff01;教你如何使用这个工具在线就能轻松搞定设计需求&#xff0c;不仅有海量模板供你使用&#xff0c;还能一键生成链接轻松转发&#xff01;…

利用vue-cli创建vue3工程

需注意&#xff1a;想创建vue3工程&#xff0c;对vue-cli版本有要求&#xff0c;必须确保vue-cli在4.5.0以上 目录 1、查看vue-cli版本 2、创建工程 3、启动 1、查看vue-cli版本 vue --version&#xff08;小写v&#xff09; vue --version或者 vue -V&#xff08;大写v&…