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

鸿蒙多线程开发——sendable共享容器

1、异步锁机制

在介绍共享容器之前,先介绍异步锁机制。

为了解决多线程并发任务间的数据竞争问题,ArkTS引入了异步锁能力。异步锁可能会被类对象持有,因此为了更方便地在并发实例间获取同一个异步锁对象,AsyncLock对象支持跨线程引用传递。

由于ArkTS语言支持异步操作,阻塞锁容易产生死锁问题,因此在ArkTS中仅支持异步锁(非阻塞式锁)。同时,异步锁还可以用于保证单线程内的异步任务时序一致性,防止异步任务时序不确定导致的同步问题。

使用异步锁的方法需要标记为async,调用方需要使用await修饰,才能保证时序正确。

为了解决@Sendable共享对象在不同线程修改共享变量导致的竞争问题,可以采用异步锁进行数据保护。Sendable共享对象在之前文章中有介绍👉🏻鸿蒙多线程开发——线程间数据通信对象03(sendable)

异步锁使用示例如下(关注9~11行,15~17行):

import { ArkTSUtils, taskpool } from '@kit.ArkTS';@Sendableexport class A {  private count_: number = 0;  lock_: ArkTSUtils.locks.AsyncLock = new ArkTSUtils.locks.AsyncLock();  public async getCount(): Promise<number> {    return this.lock_.lockAsync(() => {      return this.count_;    })  }  public async increaseCount() {    await this.lock_.lockAsync(() => {      this.count_++;    })  }}@Concurrentasync function printCount(a: A) {  console.info("InputModule: count is:" + await a.getCount());}@Entry@Componentstruct Index {  @State message: string = 'Hello World';  build() {    RelativeContainer() {      Text(this.message)        .id('HelloWorld')        .fontSize(50)        .fontWeight(FontWeight.Bold)        .alignRules({          center: { anchor: '__container__', align: VerticalAlign.Center },          middle: { anchor: '__container__', align: HorizontalAlign.Center }        })        .onClick(async () => {          let a: A = new A();          await taskpool.execute(printCount, a);        })    }    .height('100%')    .width('100%')  }}

2、共享容器

ArkTS共享容器(@arkts.collections (ArkTS容器集))是一种在并发任务间共享传输的容器类,可以用于并发场景下的高性能数据传递。

ArkTS共享容器在多个并发任务间传递时,其默认行为是引用传递,支持多个并发任务可以操作同一个容器实例。另外,也支持拷贝传递,即每个并发任务持有一个ArkTS容器实例。

ArkTS共享容器并不是线程安全的,内部使用了fail-fast(快速失败)机制,即当检测多个并发实例同时对容器进行结构性改变时,会触发异常。因此,在容器内修改属性的场景下,我们需要使用ArkTS提供的异步锁机制保证ArkTS容器的安全访问。

ArkTS共享容器包含如下几种:Array、Map、Set、TypedArray(Int8Array、Uint8Array、Int16Array、Uint16Array、Int32Array、Uint32Array、Uint8ClampedArray、Float32Array)、ArrayBuffer等。

📢 注意,这里说的容器是@arkts.collections中创建的ArkTs容器(多线程共享容器),并非平时普通使用的容器。

一个Array容器的使用案例如下:​​​​​​​

import { ArkTSUtils, collections, taskpool } from '@kit.ArkTS';@Concurrentasync function add(arr: collections.Array<number>, lock: ArkTSUtils.locks.AsyncLock) { await lock.lockAsync(() => {  // 如果不添加异步锁,任务会因为数据竞争冲突,导致抛异常失败   arr[0]++; })}@Entry@Componentstruct Index {  @State message: string = 'Hello World';  build() {    RelativeContainer() {      Text(this.message)        .id('HelloWorld')        .fontSize(50)        .fontWeight(FontWeight.Bold)        .alignRules({          center: { anchor: '__container__', align: VerticalAlign.Center },          middle: { anchor: '__container__', align: HorizontalAlign.Center }        })        .onClick(() => {          let taskGroup = new taskpool.TaskGroup();          let lock = new ArkTSUtils.locks.AsyncLock();          let arr = collections.Array.create<number>(1, 0);          let count = 1000;          while (count--) {            taskGroup.addTask(add, arr, lock);          }          taskpool.execute(taskGroup).then(() => {            console.info(`Return success: ${arr[0]} === ${count}`);          }).catch((e: Error) => {            console.error("Return error.");          })        })    }    .height('100%')    .width('100%')  }}

3、共享容器注意事项

在@arkts.collections (ArkTS容器集)中提供的容器与前端开发中JS所使用的容器大体上保持一致。但有一部分存在差异。下面对这些差异做一些归类。

📢📢 注意,这里说的容器是@arkts.collections中创建的ArkTs容器(多线程共享容器),并非平时普通使用的容器。

有差异的有:Array、Map、Set、TypedArray。(ArrayBuffer没有差异)

其中TypedArray是以下几种类型的统称:

    • Int8Array、Uint8Array、Uint8ClampedArray

    • Int16Array、Uint16Array

    • Int32Array、Uint32Array、Float32Array

3.1、Array与JS原生API的差异

支持原生容器Array通过collections.Array.from方法转换为ArkTS Array容器;支持通过原生容器Array的from方法将ArkTS Array容器转换为原生容器Array。

有差异的部分罗列如下:

原生API方法ArkTS容器集方法在ArkTS容器中的差异表现
length: numberreadonly length: number为了防止undefined扩散,不允许设置length。
new(arrayLength ?: number): any[]static create(arrayLength: number, initialValue: T): Array为了防止undefined扩散,构造函数中必须提供一个初始值的构造函数。
new <T>(...items: T[]): T[]constructor(first: T, ...left: T[])为了防止undefined扩散,构造函数中必须提供一个初始值的构造函数,继承场景下,无法调用该函数进行对象构造。
pop(): T | undefinedpop(): T | undefined不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
push(...items: T[]): numberpush(...items: T[]): number不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
concat(...items: ConcatArray<T>[]): T[]concat(...items: ConcatArray<T>[]): Array<T>不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
concat(...items: (T | ConcatArray<T>)[]): T[]concat(...items: ConcatArray<T>[]): Array<T>不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
shift(): T | undefinedshift(): T | undefined不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
sort(compareFn?: (a: T, b: T) => number): thissort(compareFn?: (a: T, b: T) => number): Array<T>1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。2. 继承场景下,无法获得实际类型的返回值。
unshift(...items: T[]): numberunshift(...items: T[]): number不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): voidforEach(callbackFn: (value: T, index: number, array: Array<T>) => void): voidArkTS不支持this,因此不支持thisArg参数。
map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[]map<U>(callbackFn: (value: T, index: number, array: Array<T>) => U): Array<U>ArkTS不支持this,因此不支持thisArg参数。
filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[]filter(predicate: (value: T, index: number, array: Array<T>) => boolean): Array<T>ArkTS不支持this,因此不支持thisArg参数。
[n: number]: T[index: number]: T不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
findIndex(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): numberfindIndex(predicate: (value: T, index: number, obj: Array<T>) => boolean): numberArkTS不支持this,因此不支持thisArg参数。
fill(value: T, start?: number, end?: number): thisfill(value: T, start?: number, end?: number): Array<T>1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。2. 继承场景下,无法获得实际类型的返回值。

3.2、TypedArray与JS原生API的差异

支持原生容器TypedArray通过collections.TypedArray.from方法转换为ArkTS TypedArray容器;

支持通过原生容器TypedArray的from方法将ArkTS TypedArray容器转换为原生容器TypedArray。

以Int8Array为例,有差异部分罗列如下:

原生API方法ArkTS容器集方法在ArkTS容器中的差异表现
copyWithin(target: number, start: number, end?: number): thiscopyWithin(target: number, start: number, end?: number): Int8Array不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
every(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): booleanevery(predicate: TypedArrayPredicateFn<number, Int8Array>): boolean1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。2. ArkTS不支持this,因此不支持thisArg参数。
fill(value: number, start?: number, end?: number): thisfill(value: number, start?: number, end?: number): Int8Array不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
filter(predicate: (value: number, index: number, array: Int8Array) => any, thisArg?: any): Int8Arrayfilter(predicate: TypedArrayPredicateFn<number, Int8Array>): Int8Array1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。2. ArkTS不支持this,因此不支持thisArg参数。
find(predicate: (value: number, index: number, obj: Int8Array) => boolean, thisArg?: any): number | undefinedfind(predicate: TypedArrayPredicateFn<number, Int8Array>): number | undefined1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。2. ArkTS不支持this,因此不支持thisArg参数。
findIndex(predicate: (value: number, index: number, obj: Int8Array) => boolean, thisArg?: any): numberfindIndex(predicate: TypedArrayPredicateFn<number, Int8Array>): numberArkTS不支持this,因此不支持thisArg参数。
forEach(callbackfn: (value: number, index: number, array: Int8Array) => void, thisArg?: any): voidforEach(callbackFn: (value: number, index: number, array: Int8Array) => void): void1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。2. ArkTS不支持this,因此不支持thisArg参数。
map(callbackfn: (value: number, index: number, array: Int8Array) => number, thisArg?: any): Int8Arraymap(callbackFn: TypedArrayForEachCallback<number, Int8Array>): Int8Array1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。2. ArkTS不支持this,因此不支持thisArg参数。
set(array: ArrayLike<number>, offset?: number): voidset(array: ArrayLike<number>, offset?: number): void不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
some(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): booleansome(predicate: TypedArrayPredicateFn<number, Int8Array>): booleanArkTS不支持this,因此不支持thisArg参数。
sort(compareFn?: (a: number, b: number) => number): thissort(compareFn?: TypedArrayCompareFn<number>): Int8Array1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。2. 继承场景下,无法获得实际类型的返回值。
subarray(begin?: number, end?: number): Int8Arraysubarray(begin?: number, end?: number): Int8Array不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
[index: number]: number[index: number]: number不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Int8Arraystatic from<T>(arrayLike: ArrayLike<T>, mapFn: TypedArrayFromMapFn<T, number>): Int8ArrayArkTS不支持this,因此不支持thisArg参数。
from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int8Arraystatic from(arrayLike: Iterable<number>, mapFn?: TypedArrayFromMapFn<number, number>): Int8ArrayArkTS不支持this,因此不支持thisArg参数。

3.3、Map与JS原生API的差异

差异部分罗列如下:

原生API方法ArkTS容器集方法在ArkTS容器中的差异表现
readonly size: numberreadonly size: number不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
clear(): voidclear(): void不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
delete(key: K): booleandelete(key: K): boolean不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): voidforEach(callbackFn: (value: V, key: K, map: Map<K, V>) => void): void1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。2. ArkTS不支持this,因此不支持thisArg参数。
get(key: K): V | undefinedget(key: K): V | undefined不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
has(key: K): booleanhas(key: K): boolean不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
set(key: K, value: V): thisset(key: K, value: V): Map<K, V>不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
new <K, V>(entries?: readonly (readonly [K, V])[] | null): Map<K, V>constructor(entries?: readonly (readonly [K, V])[] | null)构造时传入的k,v键值不能是非Sendable数据,否则编译会报错。

3.4、Set与JS原生API的差异

差异部分罗列如下:

原生API方法ArkTS容器集方法在ArkTS容器中的差异表现
readonly size: numberreadonly size: numberSendable类和接口中不允许使用计算属性名称(arkts-sendable-compated-prop-name)。
add(value: T): thisadd(value: T): Set<T>不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
clear(): voidclear(): void不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
delete(value: T): booleandelete(value: T): boolean不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any): voidforEach(callbackFn: (value: T, value2: T, set: Set<T>) => void): void1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。2. ArkTS不支持this,因此不支持thisArg参数。
has(value: T): booleanhas(value: T): boolean不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
values(): IterableIterator<T>values(): IterableIterator<T>Sendable类和接口中不允许使用计算属性名称(arkts-sendable-compated-prop-name)。
new <T = any>(values?: readonly T[] | null): Set<T>constructor(values?: readonly T[] | null)构造时传入数据不能是非Sendable数据,否则编译会报错。

相关文章:

鸿蒙多线程开发——sendable共享容器

1、异步锁机制 在介绍共享容器之前&#xff0c;先介绍异步锁机制。 为了解决多线程并发任务间的数据竞争问题&#xff0c;ArkTS引入了异步锁能力。异步锁可能会被类对象持有&#xff0c;因此为了更方便地在并发实例间获取同一个异步锁对象&#xff0c;AsyncLock对象支持跨线程…...

五天SpringCloud计划——DAY1之mybatis-plus的使用

一、引言 咱也不知道为啥SpringCloud课程会先教mybatis-plus的使用&#xff0c;但是教都教了&#xff0c;就学了吧&#xff0c;学完之后觉得mybatis-plus中的一些方法还是很好用了&#xff0c;本文作为我学习mybatis-plus的总结提升&#xff0c;希望大家看完之后也可以熟悉myba…...

Vue.js基础——贼简单易懂!!(响应式 ref 和 reactive、v-on、v-show 和 v-if、v-for、v-bind)

Vue.js是一个渐进式JavaScript框架&#xff0c;用于构建用户界面。它专门设计用于Web应用程序&#xff0c;并专注于视图层。Vue允许开发人员创建可重用的组件&#xff0c;并轻松管理状态和数据绑定。它还提供了一个虚拟DOM系统&#xff0c;用于高效地渲染和重新渲染组件。Vue以…...

警钟长鸣,防微杜渐,遨游防爆手机如何护航安全生产?

近年来&#xff0c;携非防爆手机进入危险作业区引发爆炸的新闻屡见报端。2019年山西某化工公司火灾&#xff0c;2018年延安某煤业瓦斯爆炸&#xff0c;均因工人未用防爆手机产生静电打火引发。涉爆行业领域企业量大面广&#xff0c;相当一部分企业作业场所人员密集&#xff0c;…...

中国科学院大学研究生学术英语读写教程 Unit7 Materials Science TextA 原文和翻译

中国科学院大学研究生学术英语读写教程 Unit7 Materials Science TextA 原文和翻译 Why Is the Story of Materials Really the Story of Civilisation? 为什么材料的故事实际上就是文明的故事&#xff1f; Mark Miodownik 1 Everything is made of something. Take away co…...

win10中使用ffmpeg和MediaMTX 推流rtsp视频

在win10上测试下ffmpeg推流rtsp视频&#xff0c;需要同时用到流媒体服务器MediaMTX 。ffmpeg推流到流媒体服务器MediaMTX &#xff0c;其他客户端从流媒体服务器拉流。 步骤如下&#xff1a; 1 下载MediaMTX github: Release v1.9.3 bluenviron/mediamtx GitHub​​​​​…...

代码美学2:MATLAB制作渐变色

效果&#xff1a; %代码美学&#xff1a;MATLAB制作渐变色 % 创建一个10x10的矩阵来表示热力图的数据 data reshape(1:100, [10, 10]);% 创建热力图 figure; imagesc(data);% 设置颜色映射为“cool” colormap(cool);% 在热力图上添加边框 axis on; grid on;% 设置热力图的颜色…...

gitlab:使用脚本批量下载项目,实现全项目检索

目的 当需要知道gitlab中所有项目是否存在某段代码时&#xff0c;gitlab免费版只提供了当个项目内的检索&#xff0c;当项目过多时一个个查太过繁琐。下面通过 GitLab API 将指定 Group 下的所有项目克隆到本地。此脚本会自动获取项目列表并逐一克隆它们&#xff0c;再在本地进…...

大型语言模型LLM - Finetuning vs Prompting

资料来自台湾大学李宏毅教授机器学课程ML 2023 Spring&#xff0c;如有侵权请通知下架 台大机器学课程ML 2023 Springhttps://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.php2023/3/10 课程 機器如何生成文句 内容概要 主要探讨了大型语言模型的两种不同期待及其导致的两类…...

【Python中while循环】

一、深拷贝、浅拷贝 1、需求 1&#xff09;拷贝原列表产生一个新列表 2&#xff09;想让两个列表完全独立开&#xff08;针对改操作&#xff0c;读的操作不改变&#xff09; 要满足上述的条件&#xff0c;只能使用深拷贝 2、如何拷贝列表 1&#xff09;直接赋值 # 定义一个…...

Selenium 包介绍

诸神缄默不语-个人CSDN博文目录 Selenium 是一个强大的工具&#xff0c;主要用于自动化 Web 浏览器的操作。它支持多种编程语言&#xff08;如 Python、Java、C# 等&#xff09;和主流浏览器&#xff08;如 Chrome、Firefox、Safari、Edge 等&#xff09;&#xff0c;广泛应用…...

量化交易系统开发-实时行情自动化交易-4.4.做市策略

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说做市策略原理。 做市策…...

C++设计模式(单例模式)

一、介绍 1.动机 在软件系统中&#xff0c;经常有这样一些特殊的类&#xff0c;必须保证它们在系统中只存在一个实例&#xff0c;才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器&#xff0c;提供一种机制来保证一个类只有一个实例? 这应该是类设计者的…...

图的深度优先搜索算法DFS

深度优先搜索&#xff08;DFS&#xff09;就是一种寻找图中各个顶点的方法。想象一下&#xff0c;如果你在一个迷宫里探险&#xff0c;你会怎么做呢&#xff1f;你可能会选择一直走到尽头&#xff0c;直到找不到路为止&#xff0c;然后再回过头来试试其他的路&#xff0c;这就是…...

自动泊车“哐哐撞大墙”,小米SU7智驾功能bug缠身?

文/王俣祺 导语&#xff1a;小米SU7&#xff0c;自带热度与科技光环的“流量神车”&#xff0c;近日却以一种极为“狼狈”的方式闯入大众视野。多达70余辆小米SU7陷入“泊车魔咒”&#xff0c;瞬间在网络上炸开了锅。从“科技控”到“惹祸精”的背后&#xff0c;究竟藏着怎样的…...

Linux宝塔部署wordpress网站更换服务器IP后无法访问管理后台和打开网站页面显示错乱

一、背景&#xff1a; wordpress网站搬家&#xff0c;更换服务器IP后&#xff0c;如果没有域名时&#xff0c;使用服务器IP地址无法访问管理后台和打开网站页面显示错乱。 二、解决方法如下&#xff1a; 1.wordpress搬家后&#xff0c;在新服务器上&#xff0c;新建站点时&am…...

Http文件上传

方式一&#xff1a;HttpClient public static String uploadFile(String url, Map<String, FileWrapper> fileParam, Map<String,String> otherParam){long start System.currentTimeMillis();log.info("uploadFile url: {}.",url);HttpClient client …...

哈希C++

文章目录 一.哈希的概念1.直接定址法2.负载因子 二.哈希函数1.除法散列法 / 除留余数法2.乘法散列法3.全域散列法&#xff08;了解&#xff09; 三.处理哈希冲突哈希冲突&#xff1a;1.开放定址法&#xff08;1&#xff09;线性探测&#xff1a;&#xff08;2&#xff09;二次探…...

C++11(中)

C11&#xff08;中&#xff09; 1.可变参数模板1.1.使用场景 2.lambda表达式&#xff08;重要&#xff09;2.1.使用说明2.2.函数对象与lambda表达式 3.线程库3.1.thread3.2.atomic原子库操作3.3.mutex3.3.1.mutex的种类3.3.2.lock_guard3.3.3.unique_lock &#x1f31f;&#x…...

vim 如何高亮/取消高亮

高亮 &#xff1a;在ESC模式下使用 shift # 取消高亮&#xff1a;在ESC模式下输入英文输入 :nohl (no highlight)...

C#中面试的常见问题008

1.内存泄露 内存泄露的原因&#xff1a; 未释放动态分配的内存&#xff1a;在使用malloc、new等动态内存分配函数后&#xff0c;未能正确释放内存。引用计数错误&#xff1a;在引用计数管理内存的语言中&#xff0c;增加引用计数但未相应减少&#xff0c;导致内存无法释放。循…...

【系统架构设计师】真题论文: 论数据访问层设计技术及其应用(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2016年 试题3)解题思路论文素材参考(1)数据访问层设计 JDBC 技术(2)ORM 框架技术 - Hibernate(3)ORM 框架技术 - MyBatis(4)数据访问层设计模式 - DAO 模式(5)数据访问层设计模式 - Repositor…...

力扣整理版九:贪心算法(待整理)

局部最优 全局最优 局部最优可以推出全局最优 并且想不出反例 ----------------------------- (1) 455 分发饼干 (2) 1005 k次取反后最大化的数组和 (3) 860 柠檬水找零 (2) 376 摆动序列 (3) 122 买卖股票的最佳时机2 (4) 135 分发糖果 (4) 55 跳跃游戏 (5) 45 跳…...

香橙派--安装RKMPP、x264、libdrm、FFmpeg(支持rkmpp)以及opencv(支持带rkmpp的ffmpeg)(适用于RK3588平台)

1. 安装RKMPP git clone https://github.com/rockchip-linux/mppcd mpp/build/linux/aarch64./make-Makefiles.bashmake -j8sudo make installRKMPP&#xff1a;用于编解码测试&#xff0c;支持RK3588平台。 2. 安装x264 git clone https://code.videolan.org/videolan/x264…...

计算机毕业设计Python+大模型美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

1138:将字符串中的小写字母转换成大写字母

【题目描述】 给定一个字符串&#xff0c;将其中所有的小写字母转换成大写字母。 【输入】 输入一行&#xff0c;包含一个字符串&#xff08;长度不超过100&#xff0c;可能包含空格&#xff09;。 【输出】 输出转换后的字符串。 【输入样例】 helloworld123Ha 【输出样例】…...

Wireshark抓取HTTPS流量技巧

一、工具准备 首先安装wireshark工具&#xff0c;官方链接&#xff1a;Wireshark Go Deep 二、环境变量配置 TLS 加密的核心是会话密钥。这些密钥由客户端和服务器协商生成&#xff0c;用于对通信流量进行对称加密。如果能通过 SSL/TLS 日志文件&#xff08;例如包含密钥的…...

Unity UGUI原理剖析

UI最重要的两部分 UI是如何渲染出来的点击事件如何触发何时发生UI重绘 1&#xff1a;UI如何渲染出来的 UI渲染一定是有顶点的&#xff0c;没有顶点就没法确定贴图的采样&#xff0c;UGUI的顶点在一张Mesh上创建&#xff0c;经过渲染管线UI就渲染到屏幕上了&#xff0c;UI的渲染…...

实现Excel文件和其他文件导出为压缩包,并导入

导出 后端&#xff1a; PostMapping("/exportExcelData")public void exportExcelData(HttpServletRequest request, HttpServletResponse response, RequestBody ResData resData) throws IOException {List<Long> menuIds resData.getMenuIds();List<Co…...

Linux:基础开发工具

目录 软件包管理器yum 什么是软件包&#xff1f; 查看软件包 安装软件 卸载软件 vim vim的基本操作 gcc/g使用 预处理 编译 汇编 连接 make/Makefile .PHONY伪目标 定义使用变量 版本控制器Git 安装git git的使用 git add git commit git push git pull …...

【mac】终端左边太长处理,自定义显示名称(terminal路径显示特别长)

1、打开终端 2、步骤 &#xff08;1&#xff09;修改~/.zshrc文件 nano ~/.zshrc&#xff08;2&#xff09;添加或修改PS1&#xff0c;我是自定义了名字为“macminiPro” export PS1"macminiPro$ "&#xff08;3&#xff09;使用 nano: Ctrl o &#xff08;字母…...

嵌入式硬件设计:从概念到实现的全流程

嵌入式硬件设计是现代电子技术中一个至关重要的领域&#xff0c;涉及从硬件架构设计到硬件调试的各个方面。它为我们日常生活中的各类智能设备、家电、工业控制系统等提供了强大的支持。本文将介绍嵌入式硬件设计的基本流程、关键技术、常用工具以及常见的挑战和解决方案&#…...

【Nginx】核心概念与安装配置解释

文章目录 1. 概述2. 核心概念2.1.Http服务器2.2.反向代理2.3. 负载均衡 3. 安装与配置3.1.安装3.2.配置文件解释3.2.1.全局配置块3.2.2.HTTP 配置块3.2.3.Server 块3.2.4.Location 块3.2.5.upstream3.2.6. mine.type文件 3.3.多虚拟主机配置 4. 总结 1. 概述 Nginx是我们常用的…...

数据库-MySQL-MybatisPlus实战

文章目录 前言一、整合mybatis-plus二、CRUD操作1、insert操作2、update操作3、delete操作 三、条件构造器(Wrapper)QueryWrapperUpdateWrapperLambdaQueryWrapperLambdaUpdateWrapper 四、分页查询五、自定义主键生成器六、总结 前言 mybatis相信都不陌生&#xff0c;目前互联…...

Vue2学习记录

前言 这篇笔记&#xff0c;是根据B站尚硅谷的Vue2网课学习整理的&#xff0c;用来学习的 如果有错误&#xff0c;还请大佬指正 Vue核心 Vue简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。 它基于标准 HTML、CSS 和 JavaScr…...

thinkphp中对请求封装

请求的封装 //调用 $res Http::post($this->baseUrl . $url,$params,[CURLOPT_HTTPHEADER > [Content-Type: application/json,Content-Length: . strlen($params),],]);<?php namespace fast; /*** 字符串类*/ class Http {/*** 发送一个POST请求*/public static …...

网络安全中的数据科学如何重新定义安全实践?

组织每天处理大量数据&#xff0c;这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难&#xff0c;常常导致疏忽。以前&#xff0c;公司依靠 FUD 方法&#xff08;恐惧、不确定性和怀疑&#xff09;来识别潜在攻击。然而&#xff0c;将数据科学集成到网络安全中…...

通过指令导入/导出vscode扩展插件

导出扩展&#xff1a; 打开VSCode终端&#xff1a; 在VSCode中&#xff0c;你可以通过菜单栏的“终端”选项打开终端&#xff0c;或者使用快捷键Ctrl &#xff08;反引号&#xff0c;通常在键盘左上角&#xff09;。运行导出命令&#xff1a; 在终端中&#xff0c;输入以下命…...

vscode添加环境变量(mujoco)

文章目录 前言一、创建.env文件二、编写setting.jason 前言 之前一直用pycharm&#xff0c;最近改用cursor了&#xff0c;在pycharm中设置环境变量修改运行配置就行了&#xff0c;vscode要麻烦一些&#xff0c;记录一下。 一、创建.env文件 以mujoco环境变量为例&#xff0c;…...

0-1背包问题(1):贪心算法

问题&#xff1a; 有 n 个物品和背包的容量&#xff0c;每个物品的重量为 w[i]&#xff0c;价值为 v[i]&#xff0c;背包的容量为 W。选若干个物品放入购物车&#xff0c;物品不可分割&#xff0c;使价值最大。 问题分析&#xff1a; 首先考虑贪心策略&#xff1a; 每次挑选…...

Qt界面篇:QMessageBox高级用法

1、演示效果 2、用法注意 2.1 设置图标 用于显示实际图标的pixmap取决于当前的GUI样式。也可以通过设置icon pixmap属性为图标设置自定义pixmap。 QMessageBox::Icon icon(...

计算机操作系统——进程控制(Linux)

进程控制 进程创建fork&#xff08;&#xff09;函数fork() 的基本功能fork() 的基本语法fork() 的工作原理fork() 的典型使用示例fork() 的常见问题fork() 和 exec() 结合使用总结 进程终止与$进程终止的本质进程终止的情况正常退出&#xff08;Exit&#xff09;由于信号终止非…...

游戏引擎学习第23天

实时代码编辑功能的回顾 当前实现的实时代码编辑功能已经取得了显著的成功&#xff0c;表现出强大的性能和即时反馈能力。该功能允许开发者在修改代码后几乎立即看到变化在运行中的程序中体现出来&#xff0c;极大提升了开发效率。尽管目前的演示内容较为简单&#xff0c;呈现…...

0基础学java之Day25

Vector /** 知识点&#xff1a;Vector独有的方法 理解&#xff1a; * Vector在JDK1.0开始就已经存在 -- 元老级别的集合类&#xff0c; * 集合框架的概念是JDK1.2开始才有的&#xff0c; * 开发人员为了将Vector保留下来&#xf…...

android集成FFmpeg步骤以及常用命令,踩坑经历

1、入坑第一步:首先集成的库必须正确。最好是有ndk的,FFmpeg有许多个版本,我才开始接触的时候随便选了一个,一般的 方法没有问题。但是涉及到需要使用libx264等条件进行编码时,老是报错,网上搜索资料也没有人说需要ndk的支持才行。这个问题困扰了好几天,怎么试不行,最后…...

Mac——鼠标增强插件Mos

功能说明&#xff1a; 能够解决鼠标断续、不灵敏等鼠标问题。 下载地址&#xff1a; Mac——鼠标增强插件Mos...

【c++篇】:解读Set和Map的封装原理--编程中的数据结构优化秘籍

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 前言一.set和map的初步封装1.树的节点封装修改2.Find()查找函数3.红…...

华为鸿蒙内核成为HarmonyOS NEXT流畅安全新基座

HDC2024华为重磅发布全自研操作系统内核—鸿蒙内核&#xff0c;鸿蒙内核替换Linux内核成为HarmonyOS NEXT稳定流畅新基座。鸿蒙内核具备更弹性、更流畅、更安全三大特征&#xff0c;性能超越Linux内核10.7%。 鸿蒙内核更弹性&#xff1a;元OS架构&#xff0c;性能安全双收益 万…...

ArcGIS API for Javascript学习

一、ArcGIS API for Javascript 介绍 ArcGIS API for Javascript 是由美国 Esri 公司推出&#xff0c;跟随ArcGIS 9.3 同时发布的&#xff0c;是Esri 基于dojo 框架和 REST 风格实现的一套编程接口。通过 ArcGIS API for Javascript可以对ArcGIS for Server 进行访问&#xff…...

LeetCode 3206.交替组 I:遍历

【LetMeFly】3206.交替组 I&#xff1a;遍历 力扣题目链接&#xff1a;https://leetcode.cn/problems/alternating-groups-i/ 给你一个整数数组 colors &#xff0c;它表示一个由红色和蓝色瓷砖组成的环&#xff0c;第 i 块瓷砖的颜色为 colors[i] &#xff1a; colors[i] …...