fix: 过程数据写入文件,压测0.1秒同时写入8个文件,写1000次,cpu最大波动5%
This commit is contained in:
parent
f0653c0c92
commit
baa6b80556
1
entry/src/main/ets/mock/Test.ets
Normal file
1
entry/src/main/ets/mock/Test.ets
Normal file
@ -0,0 +1 @@
|
||||
export const ProcessDataMock:string="#DN_GD,$PLC,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0_0,0,0,0,0,0,0,0,0,511,0,0,0,0,0,0,0,0,0,0,0,0,15802,0,1,0_0_0_0,0.0.0.0,V9.1_V2.1_1,65535,0,0,0/0,15802/292,0,0/0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,#END$GPS,1,16,6.068,1.301,0.000,1.07,0.64,+0.0000,+0.0000,0,091022,080109.20,3155.6715075,11851.9196718,0.012,#END"
|
||||
@ -6,4 +6,5 @@ export * from "./Judge"
|
||||
|
||||
export * from "./SignDisplay"
|
||||
|
||||
export * from "./CarCheck"
|
||||
export * from "./CarCheck"
|
||||
export * from "./Test"
|
||||
@ -32,7 +32,7 @@ export interface LogWorkerMessage {
|
||||
type: WorkerMessageType;
|
||||
data?: string;
|
||||
studentDirName?: string;
|
||||
processDataType?:ProcessDataEnumType
|
||||
processDataType?: ProcessDataEnumType
|
||||
}
|
||||
|
||||
//枚举
|
||||
@ -49,28 +49,33 @@ export enum WorkerMessageType {
|
||||
ExamProcessInit = 'examProcessInit',
|
||||
// 写过程数据
|
||||
WriteProcessData = 'writeProcessData',
|
||||
// 关闭过程数据
|
||||
CloseProcessData='closeProcessData'
|
||||
// 关闭过程数据
|
||||
CloseProcessData = 'closeProcessData'
|
||||
}
|
||||
|
||||
// 过程数据枚举
|
||||
export enum ProcessDataEnumType {
|
||||
//four_one_log_byte_data
|
||||
FourOneLogByteData = 0,
|
||||
FourOneLogByteData = "0",
|
||||
//four_one_log_data
|
||||
FourOneLogData = 1,
|
||||
FourOneLogData = "1",
|
||||
//judge_exam_data
|
||||
JudgeExamData = 2,
|
||||
JudgeExamData = "2",
|
||||
//judge_log_data
|
||||
JudgeLogData = 3,
|
||||
JudgeLogData = "3",
|
||||
// judge_progress_callback_data
|
||||
JudgeProgressCallbackData = 4,
|
||||
JudgeProgressCallbackData = "4",
|
||||
//plc_data
|
||||
PlcData = 5,
|
||||
PlcData = "5",
|
||||
//wuxi_exam_data
|
||||
WuxiExam = 6,
|
||||
WuxiExam = "6",
|
||||
//wuxi_progress_data
|
||||
WuxiProgressData = 7
|
||||
WuxiProgressData = "7"
|
||||
}
|
||||
|
||||
export interface FileQueueType {
|
||||
type: ProcessDataEnumType,
|
||||
data: string
|
||||
}
|
||||
|
||||
export interface LogPathType {
|
||||
|
||||
@ -45,7 +45,7 @@ import dayTs from '../utils/Date';
|
||||
import { GetCurrentTime } from '../utils/Common';
|
||||
import FileUtils from '../utils/FileUtils';
|
||||
import SignalTrajectoryDialog from './Judge/SignalTrajectoryDialog';
|
||||
import { DefaultJudgeConfigData } from '../mock';
|
||||
import { DefaultJudgeConfigData, ProcessDataMock } from '../mock';
|
||||
import { dConsole } from '../utils/LogWorker';
|
||||
import ConfirmDialog from './compontents/ConfirmDialog';
|
||||
import CarLoadingDialog from './compontents/CarLoading';
|
||||
@ -206,7 +206,28 @@ struct JudgePage {
|
||||
this.startFullTime = GetCurrentTime(1);
|
||||
this.startTime = dayTs().format("YYYY-MM-DD HH:mm:ss")
|
||||
this.startExamTime = dayTs().format("YYYY-MM-DD HH:mm:ss")
|
||||
|
||||
// let count = 0;
|
||||
// const totalTimes = 1000;
|
||||
// const intervalTime = 100; // 0.1秒 = 100毫秒
|
||||
//
|
||||
// const timer = setInterval(() => {
|
||||
// if (count < totalTimes) {
|
||||
// dConsole.writeProcessData(ProcessDataEnumType.FourOneLogByteData, ProcessDataMock);
|
||||
// dConsole.writeProcessData(ProcessDataEnumType.FourOneLogData, ProcessDataMock);
|
||||
// dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, ProcessDataMock);
|
||||
// dConsole.writeProcessData(ProcessDataEnumType.JudgeLogData, ProcessDataMock);
|
||||
// dConsole.writeProcessData(ProcessDataEnumType.JudgeProgressCallbackData, ProcessDataMock);
|
||||
// dConsole.writeProcessData(ProcessDataEnumType.PlcData, ProcessDataMock);
|
||||
// dConsole.writeProcessData(ProcessDataEnumType.WuxiExam, ProcessDataMock);
|
||||
// dConsole.writeProcessData(ProcessDataEnumType.WuxiProgressData, ProcessDataMock);
|
||||
// count++;
|
||||
// console.log(`已调用 ${count} 次`);
|
||||
// } else {
|
||||
// dConsole.closeProcessData()
|
||||
// clearInterval(timer);
|
||||
// console.log('已完成1000次调用');
|
||||
// }
|
||||
// }, intervalTime);
|
||||
//初始化数据库表
|
||||
await this.initDb()
|
||||
//断点续考
|
||||
@ -718,6 +739,7 @@ struct JudgePage {
|
||||
singlePlay: this.singlePlay,
|
||||
judgeConfigObj: this.judgeConfigObj,
|
||||
signalViewingClick: () => {
|
||||
dConsole.writeProcessData(ProcessDataEnumType.FourOneLogByteData, '测试测试')
|
||||
this.signalTrajectoryDialogController.open()
|
||||
},
|
||||
artificialEvaluationClick: () => {
|
||||
|
||||
@ -223,11 +223,9 @@ export function CreateDir(path: string): Promise<boolean> {
|
||||
export function EditFile(fd: number, data: string): Promise<boolean> {
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
let result = fs.writeSync(fd, data + "\n")
|
||||
console.log("创建文件之写文件成功", result.toString())
|
||||
fs.writeSync(fd, data + "\n")
|
||||
resolve(true)
|
||||
} catch (e) {
|
||||
console.log("创建文件之写文件失败")
|
||||
reject(false)
|
||||
}
|
||||
})
|
||||
|
||||
@ -74,6 +74,15 @@ class logWorker {
|
||||
this.workerInstance?.postMessage(JSON.stringify(params))
|
||||
}
|
||||
}
|
||||
// 关闭过程数据写入
|
||||
closeProcessData(){
|
||||
let params: LogWorkerMessage = {
|
||||
type: WorkerMessageType.CloseProcessData,
|
||||
}
|
||||
if (this.isLogEnabled === "1") {
|
||||
this.workerInstance?.postMessage(JSON.stringify(params))
|
||||
}
|
||||
}
|
||||
|
||||
// 通用日志方法
|
||||
private logWithLevel(level: 'log' | 'info' | 'error', ...args: ESObject[]): void {
|
||||
|
||||
@ -1,13 +1,22 @@
|
||||
import worker, { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope } from '@ohos.worker';
|
||||
import { GlobalConfig } from '../config';
|
||||
import { LogFileFd, LogPathType, LogWorkerMessage, ProcessDataEnumType, WorkerMessageType } from '../model';
|
||||
import {
|
||||
FileQueueType,
|
||||
LogFileFd,
|
||||
LogPathType,
|
||||
LogWorkerMessage,
|
||||
ProcessDataEnumType,
|
||||
WorkerMessageType
|
||||
} from '../model';
|
||||
import { CreateDir, CreateFile, EditFile, IsExit } from '../utils/Common';
|
||||
import dayTs from '../utils/Date';
|
||||
import fs from '@ohos.file.fs';
|
||||
|
||||
const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
|
||||
const fileNameArr: string[] = ["four_one_log_byte_data.text", "four_one_log_data.txt", "judge_exam_data.txt", "judge_log_data.txt", "judge_progress_callback_data.txt", "plc_data.txt", "wuxi_exam_data.txt", "wuxi_progress_data.txt"]
|
||||
const fileNameArr: string[] = ["four_one_log_byte_data.txt", "four_one_log_data.txt", "judge_exam_data.txt", "judge_log_data.txt", "judge_progress_callback_data.txt", "plc_data.txt", "wuxi_exam_data.txt", "wuxi_progress_data.txt"]
|
||||
let fileFdArr: number[] = []
|
||||
let writeQueue: Array<FileQueueType> = [];
|
||||
let isProcessing = false;
|
||||
workerPort.onmessage = (e: MessageEvents) => {
|
||||
console.log("日志系统worker收到消息")
|
||||
// 日志文件目录
|
||||
@ -15,7 +24,6 @@ workerPort.onmessage = (e: MessageEvents) => {
|
||||
log: `${GlobalConfig.commonFileWriteAddress}/logs/${dayTs().format("YYYY_MM_DD")}/log/log.log`,
|
||||
error: `${GlobalConfig.commonFileWriteAddress}/logs/${dayTs().format("YYYY_MM_DD")}/log/error.log`,
|
||||
}
|
||||
let logFileFd: LogFileFd = {}
|
||||
const result: LogWorkerMessage = JSON.parse(e.data);
|
||||
if (result.type === WorkerMessageType.Init) {
|
||||
InitLog()
|
||||
@ -25,8 +33,8 @@ workerPort.onmessage = (e: MessageEvents) => {
|
||||
InitExam(result.studentDirName)
|
||||
}
|
||||
// 写过程数据
|
||||
if (result.type === WorkerMessageType.WriteProcessData&&result.processDataType) {
|
||||
WriteProcessData(result.processDataType, result.data||"")
|
||||
if (result.type === WorkerMessageType.WriteProcessData && result.processDataType) {
|
||||
WriteProcessData(result.processDataType, result.data || "")
|
||||
}
|
||||
// 关闭过程数据
|
||||
if (result.type === WorkerMessageType.CloseProcessData) {
|
||||
@ -70,7 +78,7 @@ async function InitLog() {
|
||||
|
||||
// 初始化学员过程数据目录
|
||||
async function InitExam(dirName: string) {
|
||||
console.log("初始化过程",dirName)
|
||||
console.log("初始化过程", dirName)
|
||||
let date = dayTs().format("YYYY_MM_DD")
|
||||
const path = `${GlobalConfig.commonFileWriteAddress}/logs/${date}/${dirName}`
|
||||
const nameDirIsExit = await IsExit(path)
|
||||
@ -88,21 +96,29 @@ async function InitExam(dirName: string) {
|
||||
|
||||
// 写过程数据
|
||||
async function WriteProcessData(type: ProcessDataEnumType, data: string) {
|
||||
let index = Number(type)
|
||||
console.log("创建文件",type,index.toString(),data)
|
||||
let result=await EditFile(fileFdArr[index], data)
|
||||
if(result){
|
||||
// 写文件成功
|
||||
}else{
|
||||
// 写文件失败
|
||||
writeQueue.push({ type, data });
|
||||
|
||||
if (!isProcessing) {
|
||||
processQueue();
|
||||
}
|
||||
}
|
||||
|
||||
async function processQueue() {
|
||||
isProcessing = true;
|
||||
while (writeQueue.length > 0) {
|
||||
const item = writeQueue.shift()!;
|
||||
const index = Number(item.type);
|
||||
await EditFile(fileFdArr[index], item.data);
|
||||
}
|
||||
isProcessing = false;
|
||||
}
|
||||
|
||||
// 关闭过程数据
|
||||
function CloseProcessData() {
|
||||
fileFdArr.forEach((item: number) => {
|
||||
fs.closeSync(item)
|
||||
})
|
||||
console.log("关闭过程数据")
|
||||
}
|
||||
|
||||
workerPort.onmessageerror = (e: MessageEvents) => {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user