存在的问题:
一、不支持midmif数据格式
(一)无法摆脱数据的前处理工作
二、存在三个有效分支,各分支数据编译功能相互独立
(一)四轮的数据编译
(二)两轮的数据编译
(三)步行的数据编译
三、不支持参数可选配置和启动
(一)当前启动不可传入任何参数进行配置和选择
四、不支持http等请求方式进行交互
五、CPP-ATLAS标准化空白
六、应用线上监控日志告警空白
核心板块:
●AppDataMap工程改造
○多分支能力集成
○midmif格式支持
○Webserver兼容
●ATLAS 标准化
○构建
○部署
●AppHelloMapDataFactory功能完善
○hlog
○健壮性
○sentry
○告警
主要工作内容:
3.1AppDataMap工程改造
3.1.1改造前的检验
在做工程改造之前,首先要先确认数据编译分支中两轮、步行分支是否可以直接使用四轮分支替代,在预处理过程中再用lua文件区分预处理工作。
对比结果:
2000 case.csv
均与高德策略比较 | ||||
策略 | 百度-骑行策略 | 线上cycling策略 | bicycledatacompile (2022M9) | |
距离-整体差异率 | 0.143 | 0.176 | 0.175 | 0.327 |
距离-badcase占比 | 0.156 | 0.188 | 0.194 | 0.225 |
20000 case
均与高德策略比较 | ||||
策略 | 百度-骑行策略 | 线上cycling策略 | bicycledatacompile(2022M9) | |
距离-整体差异率 | 0.151 | 0.365 | 0.199 | 0.292 |
距离-badcase占比 | 0.144 | 0.209 | 0.206 | 0.235 |
●结论
仅仅使用一个数据编译逻辑无法同时满足四轮、两轮、步行多个场景的需求,决定改造数据编译达到同一工程同一分支支持多场景数据编译。
3.1.2变更方向
SOCKET
变更内容
1. 支持四轮、两轮、步行数据的输出
2. 支持EMG、NIMIF、腾讯等图商数据的输入
3. 支持 SOCKET 申请域名
申请AppHelloMapDataFactory应用
申请应用域名
4. 支持参数参数配置端口、线程上限、版本号
5. 支持MID MIF;
6. 支持webserver,无需重复atlas发布
3.1.3开发详情
开发List
支持web-server在线请求编译的能力
支持walking、driving、cycling
支持参数部署dataComplier服务
支持并发编译三种Mode数据
支持子线程数量可以控制
日志的打印问题在在多线程下如何区分出来
监控信息的增加
问题记录:
3.1.3.1std::thread.detach()
在使用 detach() 函数时,有一些注意事项需要考虑:
1确保线程已经完成工作:在调用 detach() 之前,确保线程已经完成了它的工作,或者你能够确定线程可以安全地在后台运行。如果线程仍然在执行关键任务,而主线程提前结束并分离了该线程,可能会导致资源泄漏或未定义行为。
2确保线程对象的生命周期有效:被分离的线程对象在分离后仍然需要保持有效的生命周期,以确保线程的运行正常。如果线程对象超出了其作用域或被销毁,而分离的线程仍在执行,可能会导致不确定的行为或崩溃。确保线程对象的生命周期足够长,或者使用动态分配的线程对象(使用 new 创建线程对象)。
3无法获取线程的返回值:一旦线程被分离,主线程将无法获取该线程的返回值。如果你需要获取线程的返回值或执行状态,那么不应该使用 detach(),而是使用 join() 函数等待线程完成并获取其结果。
4不要对已分离线程调用 join():已经分离的线程与主线程没有关联,因此不能对已分离的线程对象调用 join() 函数。如果尝试在已分离线程上调用 join(),将导致运行时错误。
5注意线程安全性:在多线程编程中,需要注意线程之间共享数据的安全性。确保在访问共享数据时进行适当的同步和互斥操作,以避免竞态条件和数据损坏。
总之,使用 detach() 函数需要谨慎考虑,并确保满足上述注意事项。detach() 适用于那些你希望让线程在后台运行,不需要等待其完成的情况。如果你需要管理线程的状态、等待线程完成并获取其结果,那么应该使用 join() 函数或其他适当的同步机制。
3.1.4.2变量作用域
主程序下的变量,和request中的变量,二者的作用域不同产生的影响也是不同的。
3.1.4.3互斥锁的问题:
#include <condition_variable>
#include <mutex>
使用mutex锁以实现互斥和计数,创建全局变量 std::mutexmtx,在特定的作用域下方,使用:std::unique_lock<std::mutex> lock(mtx) 来完成互斥。
3.2ATLAS 标准化
3.2.1CPP/C 应用发布的基础模板
涉及内部数据此处不做展示。
3.4 数据编译功能验证
3.4.1四轮验证
结论:比较对照组和实验组数据编译结果,二者产生的文件完全一致。(符合预期)
3.4.2两轮验证
●测试输入数据(广州市—单车订单的开关锁位置):
bike_case.csv(1.1 MB)
bike_test_2000.csv(114 kB)
●对比结果:
1474 case
均与高德策略比较 | ||||
策略 | 百度-骑行策略 | 线上cycling策略 | bicycledatacompile (2022M9) | |
距离-整体差异率 | 0.143 | 0.178 | 0.175 | 0.177 |
距离-badcase占比 | 0.155 | 0.189 | 0.184 | 0.187 |
14408 case
均与高德策略比较 | ||||
策略 | 百度-骑行策略 | 线上cycling策略 | bicycledatacompile(2022M9) | |
距离-整体差异率 | 0.171 | 0.438 | 0.22 | 0.22 |
距离-badcase占比 | 0.155 | 0.213 | 0.207 | 0.206 |
结论:比较对照组和实验组的骑行路径规划结果,实验组的效果优于对照组(线上效果)。
3.4.3步行验证
●测试输入数据(广州市—单车订单的开关锁位置):
bike_case.csv(1.1 MB)
bike_test_2000.csv(114 kB)
●对比结果:
1474 case
均与高德策略比较 | ||||
策略 | 百度-步行策略 | 线上walking策略 | walkingdatacompile (2022M9) | |
距离-整体差异率 | 0.065 | 0.109 | 0.105 | 0.104 |
距离-badcase占比 | 0.036 | 0.095 | 0.09 | 0.089 |
14391 case
均与高德策略比较 | ||||
策略 | 百度-步行策略 | 线上walking策略 | walkingdatacompile (2022M9) | |
unrelease-5.28.0/hellomaproute-independent-master | ||||
距离-整体差异率 | 0.066 | 0.463 | 0.134 | 0.133 |
距离-badcase占比 | 0.042 | 0.102 | 0.099 | 0.099 |
结论:比较对照组和实验组的骑行路径规划结果,实验组的效果优于对照组(线上效果)。