本文将深入探讨HarmonyOS 5(API 12)中的后台任务调度机制,重点讲解JobScheduler和WorkManager的使用方法、适用场景及最佳实践,帮助开发者实现高效、智能的后台任务管理。

1. 后台任务调度概述

HarmonyOS提供了两种主要的后台任务调度方式:JobSchedulerWorkManager。两者都支持基于条件触发任务执行,但各有不同的设计目标和适用场景。

1.1 核心特性对比

特性维度JobSchedulerWorkManager
设计目标系统级任务调度,精确控制执行时机应用级任务管理,更灵活的任务链
最低APIAPI 9+API 12+
任务持久化支持设备重启后继续执行支持,且提供更丰富的重试策略
任务链有限支持完整支持(链式、并行、组合)
约束条件网络、充电、设备空闲等网络、充电、存储、电池等更丰富条件
适用场景精确时间要求的系统任务复杂的业务逻辑和任务依赖关系

2. JobScheduler实战开发

JobScheduler适合执行对时间精度要求高、需要系统级调度的后台任务。

2.1 创建JobService

首先创建继承自JobService的类,实现任务逻辑:

import { JobService, JobInfo, JobParameters } from '@ohos.resourceschedule.backgroundTaskManager';
import { BusinessError } from '@ohos.base';
import hilog from '@ohos.hilog';// 定义任务标识
const JOB_ID = 1001;
const LOG_TAG = 'DataSyncJob';export default class DataSyncJob extends JobService {// 任务开始时调用onStartJob(parameters: JobParameters): boolean {hilog.info(0x0000, LOG_TAG, '数据同步任务开始执行');// 执行异步任务this.performDataSync(parameters).then(() => {hilog.info(0x0000, LOG_TAG, '数据同步任务完成');this.jobFinished(parameters, false); // 任务完成,不需要重试}).catch((error: BusinessError) => {hilog.error(0x0000, LOG_TAG, `数据同步失败: ${error.message}`);this.jobFinished(parameters, true); // 任务失败,需要重试});return true; // 返回true表示任务正在异步执行}// 任务停止时调用(系统强制停止)onStopJob(parameters: JobParameters): boolean {hilog.info(0x0000, LOG_TAG, '数据同步任务被停止');// 执行清理操作this.cleanupResources();return false; // 返回false表示不需要重新调度任务}// 执行实际的数据同步逻辑private async performDataSync(parameters: JobParameters): Promise<void> {const extras = parameters.getExtras();const syncType = extras?.getString('sync_type') || 'full';hilog.info(0x0000, LOG_TAG, `开始${syncType}数据同步`);// 模拟网络请求和数据同步await this.fetchDataFromServer();await this.processAndStoreData();await this.updateLocalCache();hilog.info(0x0000, LOG_TAG, '数据同步流程完成');}private async fetchDataFromServer(): Promise<void> {// 实现网络请求逻辑await new Promise(resolve => setTimeout(resolve, 2000)); // 模拟网络延迟hilog.debug(0x0000, LOG_TAG, '从服务器获取数据成功');}private async processAndStoreData(): Promise<void> {// 实现数据处理和存储逻辑await new Promise(resolve => setTimeout(resolve, 1000));hilog.debug(0x0000, LOG_TAG, '数据处理和存储完成');}private async updateLocalCache(): Promise<void> {// 更新本地缓存await new Promise(resolve => setTimeout(resolve, 500));hilog.debug(0x0000, LOG_TAG, '本地缓存更新完成');}private cleanupResources(): void {// 清理网络连接、文件句柄等资源hilog.debug(0x0000, LOG_TAG, '任务资源清理完成');}
}

2.2 配置和调度任务

module.json5中注册JobService:

{"module": {"abilities": [{"name": "DataSyncJob","type": "jobService","visible": true,"permissions": ["ohos.permission.INTERNET","ohos.permission.GET_NETWORK_INFO"]}]}
}

在页面中调度任务:

import { backgroundTaskManager, JobInfo, JobScheduler } from '@ohos.resourceschedule.backgroundTaskManager';
import { BusinessError } from '@ohos.base';
import common from '@ohos.app.ability.common';
import hilog from '@ohos.hilog';@Entry
@Component
struct JobSchedulerDemo {private context: common.Context = getContext(this) as common.Context;@State jobStatus: string = '未调度';// 调度周期性数据同步任务private async schedulePeriodicSync(): Promise<void> {try {const jobInfo: JobInfo = {jobId: 1001,bundleName: this.context.applicationInfo.name,abilityName: 'DataSyncJob',type: backgroundTaskManager.JobType.JOB_TYPE_PERIODIC,period: 2 * 60 * 60 * 1000, // 每2小时执行一次requiredNetworkType: backgroundTaskManager.NetworkType.NETWORK_TYPE_ANY,isChargingRequired: true,isBatteryNotLowRequired: true,isDeviceIdleRequired: false,isPersisted: true, // 设备重启后保持任务extras: {'sync_type': 'incremental','priority': 'high'}};const scheduler: JobScheduler = backgroundTaskManager.getJobScheduler(this.context);const result = await scheduler.schedule(jobInfo);if (result === backgroundTaskManager.JobSchedulerResult.RESULT_SUCCESS) {this.jobStatus = '周期性同步任务已调度';hilog.info(0x0000, 'JobSchedulerDemo', '周期性数据同步任务调度成功');} else {this.jobStatus = '任务调度失败';hilog.error(0x0000, 'JobSchedulerDemo', `任务调度失败,错误码: ${result}`);}} catch (error) {const err = error as BusinessError;hilog.error(0x0000, 'JobSchedulerDemo', `调度任务异常: ${err.message}`);this.jobStatus = `调度异常: ${err.message}`;}}// 调度一次性任务private async scheduleOneTimeTask(): Promise<void> {try {const jobInfo: JobInfo = {jobId: 1002,bundleName: this.context.applicationInfo.name,abilityName: 'DataSyncJob',type: backgroundTaskManager.JobType.JOB_TYPE_ONE_SHOT,minLatency: 5000, // 5秒后执行requiredNetworkType: backgroundTaskManager.NetworkType.NETWORK_TYPE_UNMETERED,extras: {'sync_type': 'full','priority': 'critical'}};const scheduler: JobScheduler = backgroundTaskManager.getJobScheduler(this.context);const result = await scheduler.schedule(jobInfo);if (result === backgroundTaskManager.JobSchedulerResult.RESULT_SUCCESS) {this.jobStatus = '一次性任务已调度';hilog.info(0x0000, 'JobSchedulerDemo', '一次性任务调度成功');}} catch (error) {const err = error as BusinessError;hilog.error(0x0000, 'JobSchedulerDemo', `一次性任务调度异常: ${err.message}`);}}// 取消任务private async cancelJob(jobId: number): Promise<void> {try {const scheduler: JobScheduler = backgroundTaskManager.getJobScheduler(this.context);await scheduler.cancel(jobId);this.jobStatus = `任务 ${jobId} 已取消`;hilog.info(0x0000, 'JobSchedulerDemo', `任务 ${jobId} 取消成功`);} catch (error) {const err = error as BusinessError;hilog.error(0x0000, 'JobSchedulerDemo', `取消任务异常: ${err.message}`);}}build() {Column({ space: 10 }) {Text('JobScheduler任务调度演示').fontSize(20).margin(10)Text(`任务状态: ${this.jobStatus}`).fontSize(16).margin(5)Button('调度周期性同步任务').onClick(() => this.schedulePeriodicSync()).width('80%').margin(10)Button('调度一次性任务').onClick(() => this.scheduleOneTimeTask()).width('80%').margin(10)Button('取消所有任务').onClick(() => {this.cancelJob(1001);this.cancelJob(1002);}).width('80%').margin(10)}.width('100%').height('100%')}
}

3. WorkManager实战开发

WorkManager适合处理复杂的业务工作流,支持任务链和丰富的约束条件。

3.1 创建Worker类

import { Worker, WorkRequest, WorkInfo } from '@ohos.app.dispatcher.workManager';
import { BusinessError } from '@ohos.base';
import hilog from '@ohos.hilog';const LOG_TAG = 'ImageProcessingWorker';// 图像处理工作器
export default class ImageProcessingWorker extends Worker {// 执行实际工作async doWork(parameters: WorkRequest): Promise<WorkRequest.Result> {hilog.info(0x0000, LOG_TAG, '开始图像处理任务');try {const imageUrl = parameters.getString('image_url');const processType = parameters.getString('process_type', 'thumbnail');// 执行图像处理const resultPath = await this.processImage(imageUrl, processType);hilog.info(0x0000, LOG_TAG, '图像处理任务完成');// 返回成功结果return WorkRequest.Result.success(new WorkRequest.Data.Builder().putString('processed_image_path', resultPath).putLong('processing_time', Date.now()).build());} catch (error) {const err = error as BusinessError;hilog.error(0x0000, LOG_TAG, `图像处理失败: ${err.message}`);// 返回失败结果,支持重试return WorkRequest.Result.retry();}}private async processImage(imageUrl: string, processType: string): Promise<string> {hilog.debug(0x0000, LOG_TAG, `处理图像: ${imageUrl}, 类型: ${processType}`);// 模拟图像处理过程await new Promise(resolve => setTimeout(resolve, 3000));// 返回处理后的图像路径return `/data/storage/processed/${Date.now()}_${processType}.jpg`;}
}

3.2 配置工作请求和约束条件

import { WorkManager, WorkRequest, Constraints } from '@ohos.app.dispatcher.workManager';
import { BusinessError } from '@ohos.base';
import common from '@ohos.app.ability.common';
import hilog from '@ohos.hilog';@Entry
@Component
struct WorkManagerDemo {private context: common.Context = getContext(this) as common.Context;@State workStatus: string = '未开始';private workId: string = '';// 创建图像处理任务private async createImageProcessingWork(): Promise<void> {try {// 定义约束条件const constraints: Constraints = {requiredNetworkType: WorkRequest.NetworkType.CONNECTED,requiresCharging: false,requiresBatteryNotLow: true,requiresStorageNotLow: true,requiresDeviceIdle: false};// 创建工作任务const workRequest: WorkRequest = new WorkRequest.Builder(this.context).setWorkerClass(ImageProcessingWorker).setConstraints(constraints).setInputData(new WorkRequest.Data.Builder().putString('image_url', 'https://example.com/image.jpg').putString('process_type', 'enhance').build()).setBackoffCriteria(WorkRequest.BackoffPolicy.EXPONENTIAL,30000, // 30秒重试延迟WorkRequest.BackoffDelayUnit.MILLISECONDS).build();// 获取WorkManager实例const workManager = WorkManager.getInstance(this.context);// 提交任务this.workId = await workManager.enqueue(workRequest);this.workStatus = `任务已提交,ID: ${this.workId}`;hilog.info(0x0000, 'WorkManagerDemo', `任务提交成功,ID: ${this.workId}`);// 监听任务状态this.monitorWorkStatus(this.workId);} catch (error) {const err = error as BusinessError;hilog.error(0x0000, 'WorkManagerDemo', `创建任务失败: ${err.message}`);this.workStatus = `任务创建失败: ${err.message}`;}}// 监听任务状态变化private async monitorWorkStatus(workId: string): Promise<void> {try {const workManager = WorkManager.getInstance(this.context);workManager.getWorkInfoById(workId).then((workInfo: WorkInfo) => {this.handleWorkInfoUpdate(workInfo);}).catch((error: BusinessError) => {hilog.error(0x0000, 'WorkManagerDemo', `获取任务信息失败: ${error.message}`);});// 监听任务状态变化workManager.addWorkStatusListener(workId, (workInfo: WorkInfo) => {this.handleWorkInfoUpdate(workInfo);});} catch (error) {const err = error as BusinessError;hilog.error(0x0000, 'WorkManagerDemo', `监听任务状态失败: ${err.message}`);}}private handleWorkInfoUpdate(workInfo: WorkInfo): void {switch (workInfo.state) {case WorkInfo.State.ENQUEUED:this.workStatus = '任务排队中';break;case WorkInfo.State.RUNNING:this.workStatus = '任务执行中';break;case WorkInfo.State.SUCCEEDED:this.workStatus = '任务成功完成';const outputData = workInfo.outputData;const imagePath = outputData?.getString('processed_image_path');hilog.info(0x0000, 'WorkManagerDemo', `处理后的图像路径: ${imagePath}`);break;case WorkInfo.State.FAILED:this.workStatus = '任务执行失败';break;case WorkInfo.State.CANCELLED:this.workStatus = '任务已取消';break;}}// 创建任务链private async createWorkChain(): Promise<void> {try {const workManager = WorkManager.getInstance(this.context);// 第一个任务:下载图像const downloadWork = new WorkRequest.Builder(this.context).setWorkerClass(ImageDownloadWorker).setConstraints({requiredNetworkType: WorkRequest.NetworkType.CONNECTED}).build();// 第二个任务:处理图像(依赖第一个任务)const processWork = new WorkRequest.Builder(this.context).setWorkerClass(ImageProcessingWorker).setConstraints({requiresBatteryNotLow: true}).build();// 第三个任务:上传结果const uploadWork = new WorkRequest.Builder(this.context).setWorkerClass(ImageUploadWorker).setConstraints({requiredNetworkType: WorkRequest.NetworkType.UNMETERED}).build();// 创建任务链:下载 → 处理 → 上传await workManager.beginWith(downloadWork).then(processWork).then(uploadWork).enqueue();this.workStatus = '任务链已提交';hilog.info(0x0000, 'WorkManagerDemo', '图像处理任务链提交成功');} catch (error) {const err = error as BusinessError;hilog.error(0x0000, 'WorkManagerDemo', `创建任务链失败: ${err.message}`);}}build() {Column({ space: 10 }) {Text('WorkManager任务管理演示').fontSize(20).margin(10)Text(`任务状态: ${this.workStatus}`).fontSize(16).margin(5)Button('提交图像处理任务').onClick(() => this.createImageProcessingWork()).width('80%').margin(10)Button('提交任务链').onClick(() => this.createWorkChain()).width('80%').margin(10)Button('取消任务').onClick(async () => {if (this.workId) {const workManager = WorkManager.getInstance(this.context);await workManager.cancelWorkById(this.workId);this.workStatus = '任务已取消';}}).width('80%').margin(10)}.width('100%').height('100%')}
}

4. 高级特性与最佳实践

4.1 智能任务调度策略

根据设备状态和用户习惯智能调度任务:

import { backgroundTaskManager } from '@ohos.resourceschedule.backgroundTaskManager';
import deviceInfo from '@ohos.deviceInfo';
import { BusinessError } from '@ohos.base';class SmartScheduler {// 根据设备状态选择最佳调度策略static async scheduleWithSmartStrategy(jobInfo: JobInfo): Promise<void> {const deviceType = deviceInfo.deviceType;const isLowEndDevice = deviceInfo.totalMemory < 1024; // 内存小于1GB// 根据设备类型调整任务参数if (deviceType === 'wearable' || isLowEndDevice) {// 穿戴设备或低端设备:减少频率,增加延迟容忍度jobInfo.period = jobInfo.period ? jobInfo.period * 2 : 4 * 60 * 60 * 1000; // 每4小时jobInfo.isBatteryNotLowRequired = true;jobInfo.requiredNetworkType = backgroundTaskManager.NetworkType.NETWORK_TYPE_UNMETERED;} else if (deviceType === 'tablet' || deviceType === 'pc') {// 平板或PC:更积极的调度策略jobInfo.period = jobInfo.period || 60 * 60 * 1000; // 每1小时jobInfo.isChargingRequired = false;}// 根据时间选择执行窗口(避免用户活跃时段)const currentHour = new Date().getHours();if (currentHour >= 9 && currentHour <= 18) {// 白天工作时间:降低优先级jobInfo.priority = backgroundTaskManager.JobPriority.PRIORITY_LOW;} else {// 夜间:正常优先级jobInfo.priority = backgroundTaskManager.JobPriority.PRIORITY_DEFAULT;}try {const scheduler = backgroundTaskManager.getJobScheduler(getContext());await scheduler.schedule(jobInfo);} catch (error) {throw new Error(`智能调度失败: ${(error as BusinessError).message}`);}}// 根据网络类型调整任务行为static async adjustForNetworkType(taskId: string): Promise<void> {import network from '@ohos.net';const netHandle = await network.getDefaultNet();const netCapabilities = await netHandle.getNetCapabilities();if (netCapabilities.hasCapability(network.NetCap.NET_CAPABILITY_INTERNET)) {if (netCapabilities.hasCapability(network.NetCap.NET_CAPABILITY_NOT_METERED)) {// 非计量网络:执行大数据量任务await this.executeDataIntensiveTask(taskId);} else {// 计量网络:执行必要的小数据量任务await this.executeEssentialTaskOnly(taskId);}}}
}

4.2 任务监控与调试

实现任务执行监控和性能分析:

import { WorkManager, WorkInfo } from '@ohos.app.dispatcher.workManager';
import hilog from '@ohos.hilog';class TaskMonitor {private static monitoredWorks: Map<string, number> = new Map();// 监控任务执行时间static startMonitoring(workId: string): void {this.monitoredWorks.set(workId, Date.now());hilog.info(0x0000, 'TaskMonitor', `开始监控任务: ${workId}`);}// 记录任务完成情况static recordCompletion(workId: string, success: boolean): void {const startTime = this.monitoredWorks.get(workId);if (startTime) {const duration = Date.now() - startTime;hilog.info(0x0000, 'TaskMonitor', `任务 ${workId} ${success ? '完成' : '失败'}, 耗时: ${duration}ms`);this.monitoredWorks.delete(workId);// 性能统计:记录到分析平台this.logPerformanceMetrics(workId, duration, success);}}// 监控所有任务状态static async monitorAllWorks(): Promise<void> {try {const workManager = WorkManager.getInstance(getContext());const workInfos = await workManager.getWorkInfos();workInfos.forEach((workInfo: WorkInfo) => {hilog.debug(0x0000, 'TaskMonitor', `任务 ${workInfo.id}: ${workInfo.state}, 尝试次数: ${workInfo.runAttemptCount}`);});} catch (error) {hilog.error(0x0000, 'TaskMonitor', '监控任务状态失败');}}
}

5. 性能优化与资源管理

5.1 电池优化策略

import batteryInfo from '@ohos.batteryInfo';
import { backgroundTaskManager } from '@ohos.resourceschedule.backgroundTaskManager';class BatteryAwareScheduler {// 根据电池状态调整任务调度static async scheduleWithBatteryAwareness(jobInfo: JobInfo): Promise<void> {const batteryLevel = await batteryInfo.getBatteryLevel();const isCharging = await batteryInfo.isCharging();if (batteryLevel < 20 && !isCharging) {// 低电量未充电:只执行关键任务if (!this.isCriticalTask(jobInfo)) {hilog.info(0x0000, 'BatteryAwareScheduler', '电池电量低,延迟非关键任务');jobInfo.minLatency = 6 * 60 * 60 * 1000; // 延迟6小时}}if (batteryLevel > 80 || isCharging) {// 高电量或充电中:执行资源密集型任务jobInfo.isBatteryNotLowRequired = false;}}private static isCriticalTask(jobInfo: JobInfo): boolean {const criticalTags = ['sync', 'notification', 'backup'];return criticalTags.some(tag => jobInfo.abilityName.includes(tag));}
}

5.2 内存优化策略

import systemMemory from '@ohos.systemMemory';class MemoryAwareWorker {// 检查内存状态后再执行任务async executeWithMemoryCheck(task: () => Promise<void>): Promise<void> {const memoryInfo = await systemMemory.getMemoryInfo();const availableMemory = memoryInfo.availRam;if (availableMemory < 100 * 1024 * 1024) { // 100MB阈值hilog.warn(0x0000, 'MemoryAwareWorker', '可用内存不足,延迟任务执行');await this.cleanupMemory();await new Promise(resolve => setTimeout(resolve, 30000)); // 等待30秒}await task();}private async cleanupMemory(): Promise<void> {// 清理缓存、释放资源hilog.info(0x0000, 'MemoryAwareWorker', '执行内存清理');}
}

6. 实战案例:智能数据同步系统

以下是一个完整的智能数据同步系统示例:

import { backgroundTaskManager, JobInfo, JobScheduler } from '@ohos.resourceschedule.backgroundTaskManager';
import { WorkManager, WorkRequest, Constraints } from '@ohos.app.dispatcher.workManager';
import { BusinessError } from '@ohos.base';
import deviceInfo from '@ohos.deviceInfo';
import network from '@ohos.net';@Entry
@Component
struct SmartDataSyncSystem {private context: common.Context = getContext(this) as common.Context;@State systemStatus: string = '就绪';// 初始化智能同步系统async aboutToAppear(): Promise<void> {await this.initializeSyncSystem();}private async initializeSyncSystem(): Promise<void> {// 根据设备能力选择不同的调度策略const deviceCapabilities = await this.assessDeviceCapabilities();if (deviceCapabilities.highPerformance) {await this.scheduleAggressiveSyncStrategy();} else {await this.scheduleConservativeSyncStrategy();}this.systemStatus = '同步系统已初始化';}// 评估设备能力private async assessDeviceCapabilities(): Promise<{ highPerformance: boolean }> {const totalMemory = deviceInfo.totalMemory;const deviceType = deviceInfo.deviceType;const netHandle = await network.getDefaultNet();const netCapabilities = await netHandle.getNetCapabilities();return {highPerformance: totalMemory >= 2048 && // 2GB以上内存deviceType !== 'wearable' && // 非穿戴设备netCapabilities.hasCapability(network.NetCap.NET_CAPABILITY_INTERNET)};}// 高性能设备策略:频繁同步private async scheduleAggressiveSyncStrategy(): Promise<void> {const jobInfo: JobInfo = {jobId: 2001,bundleName: this.context.applicationInfo.name,abilityName: 'DataSyncJob',type: backgroundTaskManager.JobType.JOB_TYPE_PERIODIC,period: 30 * 60 * 1000, // 每30分钟requiredNetworkType: backgroundTaskManager.NetworkType.NETWORK_TYPE_ANY,isPersisted: true,extras: { 'sync_mode': 'aggressive' }};const scheduler = backgroundTaskManager.getJobScheduler(this.context);await scheduler.schedule(jobInfo);}// 低性能设备策略:保守同步private async scheduleConservativeSyncStrategy(): Promise<void> {const constraints: Constraints = {requiredNetworkType: WorkRequest.NetworkType.UNMETERED,requiresCharging: true,requiresBatteryNotLow: true};const workRequest = new WorkRequest.Builder(this.context).setWorkerClass(DataSyncWorker).setConstraints(constraints).setPeriodic(2 * 60 * 60 * 1000) // 每2小时.build();const workManager = WorkManager.getInstance(this.context);await workManager.enqueue(workRequest);}build() {Column({ space: 10 }) {Text('智能数据同步系统').fontSize(20).margin(10)Text(`系统状态: ${this.systemStatus}`).fontSize(16).margin(5)Button('立即同步').onClick(() => this.triggerImmediateSync()).width('80%').margin(10)Button('查看同步统计').onClick(() => this.showSyncStatistics()).width('80%').margin(10)}.width('100%').height('100%')}
}

7. 总结

通过合理使用JobScheduler和WorkManager,开发者可以在HarmonyOS中实现高效、智能的后台任务调度:

  1. 正确选择调度器:精确计时需求用JobScheduler,复杂工作流用WorkManager
  2. 智能条件判断:根据设备状态、网络条件、电池情况动态调整任务策略
  3. 资源优化:实现内存和电池感知的任务调度,提升系统整体性能
  4. 监控调试:建立完善的任务监控体系,确保任务可靠执行
  5. 用户体验:避免在用户活跃时段执行资源密集型任务

遵循这些最佳实践,可以构建出既高效又省电的后台任务系统,为用户提供无缝的应用体验。

需要参加鸿蒙认证的请点击 鸿蒙认证链接

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prompt工程实践

你在写prompt时候&#xff0c;是不是总觉得大模型它不听话。要么答非所问、要么一堆废话。扒开思考过程仔细阅读时而觉得它聪明绝顶&#xff0c;时而又觉得它愚蠢至极。明明已经对了怎么又推理到错的地方去了&#xff0c;明明在提示词中提醒过了不要这么思考它怎么就瞎想了。这…

基于springboot的毕业旅游一站式定制系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

输入1.8V~5.5V 输出28V DCDC升压芯片TLV61046A

今天来一款TI的升压芯片TLV61046A。输入电压范围1.8V~5.5V。最高可以输出28V。开关电流980mA&#xff0c;那具体能输出多大的电流就得看输入输出的电压了。以上面的输入3.6V输出12V为例&#xff0c;效率是85%&#xff0c;那最高可以输出的电流就差不多只有200mA左右。封装也是非…

ubuntu22.04源码安装ffmpeg-4.4

# ubuntu22.04源码安装ffmpeg-4.4cd /tmpwget https://ffmpeg.org/releases/ffmpeg-4.4.6.tar.xztar -xvf ffmpeg-4.4.6.tar.xzcd ffmpeg-4.4.6apt updateapt install -y yasm pkg-config libx264-dev libx265-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev libav…

Pyhon中字符串常用的函数

一、字符串的格式化1.format()方法format()是 Python 中用于字符串格式化的方法&#xff0c;通过占位符&#xff08;如 {}&#xff09;动态插入变量或表达式。name小明 age18 grade99.556245585 information"我是{}&#xff0c;今年{}岁了,考试得分&#xff1a;{:.2f}&quo…

小迪安全v2023学习笔记(八十一讲)—— 框架安全ThinkPHPLaravelStruts2SpringBootCVE复现

文章目录前记服务攻防——第八十一天开发框架安全&SpringBoot&Struts2&Laravel&ThinkPHP&CVE复现开发框架 - 常见语言开发框架PHP - 框架安全-Thinkphp&LaravelLaravel漏洞介绍漏洞复现CVE-2021-3129ThinkPHP漏洞介绍漏洞复现CVE-2018-1002015QVD-2022…

从音频到Token:构建原神角色语音识别模型的完整实践

本文将带你从零实现一个基于音频Token化的角色语音识别系统&#xff0c;完整复现原神角色语音分类任务&#xff0c;包含数据处理、模型训练和推理全流程。音频波形通过滑动窗口转换为数值Token序列的过程 一、为什么需要音频Token化&#xff1f; 传统音频处理通常依赖MFCC、频谱…

关于TCP和UDP两种网络协议的区别

1、tcp协议TCP (Transmission Control Protocol - 传输控制协议)TCP 的核心目标是为应用层提供一条可靠的、无差错的、有序的字节流通道。主要特点&#xff1a;面向连接&#xff1a;在数据传输之前&#xff0c;必须通过“三次握手”建立稳定的连接&#xff0c;传输结束后通过“…

Alibaba Lens:阿里巴巴推出的 AI 图像搜索浏览器扩展,助力B2B采购

本文转载自&#xff1a;https://www.hello123.com/alibaba-lens ** 一、&#x1f31f; 一键截图&#xff0c;轻松找货&#xff1a;采购神器 Alibaba Lens 详解 Alibaba Lens 是阿里巴巴集团专为全球 B2B 采购商打造的一款智能浏览器插件&#xff08;支持 Chrome 等主流浏览器…

WPF常见问题清单

1.Grid 内容自动换行及自适应行高 <DataGrid Grid.Row"1" FontSize"14" IsReadOnly"True" VerticalScrollBarVisibility"Auto" RowHeight"NaN" ItemsSource"{Binding List}" AutoGenerateColumns"False…

Linux驱动开发笔记(十)——中断

视频&#xff1a;第13.1讲 Linux中断实验-Linux内核中断框架简介_哔哩哔哩_bilibili 文档&#xff1a;《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81.pdf》五十一章 1. 中断API函数 每个中断都有一个中断号&#xff0c;通过中断号即可区分不同的中断。在Linux 内核中使用一…

ubuntu18.04安装PCL1.14

简化版说明 1. 安装依赖库&#xff1a; (1) boost1.84 &#xff08;https://www.boost.org/releases/1.84.0/&#xff09; tar vxf boost_xxx.tar.gz ./bootstrap.sh --prefix/usr/local/ ./b2 sudo ./b2 install (2) vtk9.1.0 &#xff08;https://vtk.org/files/releas…

python将pdf转txt,并切割ai

python将pdf转txt&#xff0c;并切割ai step1:pdf转换 from PIL import Image import pytesseract import os import tempfile from pdf2image import convert_from_path# 设置 Tesseract 路径 pytesseract.pytesseract.tesseract_cmd rC:\Users\wangrusheng\AppData\Local\Pr…

Ubuntu22.04更换阿里镜像源,ubuntu更换源

在 Ubuntu 22.04 上更换为阿里云镜像源可以加速软件包的下载和更新&#xff0c;大幅提升系统更新速度。以下是更换阿里云镜像源的步骤&#xff1a;1. 备份现有源列表在更换镜像源之前&#xff0c;建议先备份当前的源配置文件&#xff1a;bashsudo cp /etc/apt/sources.list /et…

Git版本控制工具+基础命令

Git是什么&#xff1f;Git是目前世界上最先进的分布式版本控制系统代码托管平台&#xff1a;Gitlab/Github/Gitee&#xff08;码云&#xff09;什么是版本控制系统&#xff1f;指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理。版本控制最主要的功能就是追…

图解设计模式【3】

本系列共分为三篇文章&#xff0c;其中包含的设计模式如下表&#xff1a; 名称设计模式图解设计模式【1】Iterator、Adapter、Template Method、Factory Method、Singleton、Prototype、 Builder、Abstract Factory、 Bridge、 Strategy图解设计模式【2】Composite、 Decorato…

(纯新手教学)计算机视觉(opencv)实战十四——模板与多个对象匹配

图片旋转、图片镜像相关教学&#xff1a; &#xff08;纯新手教学&#xff09;计算机视觉&#xff08;opencv&#xff09;实战十三——图片旋转、图片镜像 的几种常用方法-CSDN博客https://blog.csdn.net/2302_78022640/article/details/151356600?spm1011.2415.3001.5331 模板…

Java面试核心知识点总结:Redis与MySQL高可用、高并发解决方案

在分布式系统开发中&#xff0c;高并发场景下的数据一致性、系统可用性以及性能优化始终是核心挑战。本文基于Java技术栈&#xff0c;结合Redis与MySQL的工程实践&#xff0c;系统梳理分布式系统设计的关键技术要点。一、Redis集群架构演进与高可用实践1.1 主从哨兵模式部署方案…

R 语言科研绘图第 72 期 --- mantel检验图

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

4.2-中间件之MySQL

4.2.1MySQL的基本知识SQL语句用于存取数据以及查询、更新和管理关系数据库系统。包括&#xff1a;DQL&#xff08;select&#xff09;、DML&#xff08;insert,update,delete&#xff09;、DDL&#xff08;create,alter,drop&#xff09;、DCL&#xff08;grant,revoke&#xf…