AI大模型编写多线程并发框架(六十二):限流和并发度优化

news2024/11/23 21:29:58

系列文章目录


文章目录

  • 系列文章目录
  • 前言
    • 一、项目背景
    • 二、第三轮对话-补充异步执行代码
    • 三、第四轮对话-增加限流器
    • 四、第五轮对话-抽取限流器接口
    • 五、第六轮对话-修改并发度
    • 三、参考文章


前言

在这个充满技术创新的时代,AI大模型正成为开发者们的新宠。它们可以帮助我们完成从简单的问答到复杂的编程任务,所以AI编程将会是未来的主流方向,利用AI大模型的能力,本文将介绍从零到一用AI大模型编写一个多线程并发框架。

一、项目背景

由于博主每次批量处理数据任务时,都需要去考虑线程池各种参数,例如考虑任务执行速率、任务监控、任务回调、异常处理等。由于每个需求的实际诉求不一样,所以数据处理任务的代替代码都一样,只有部分有差异,从而导致代码仓库里各种复制粘贴,
这不是博主想要的,于是,萌发了一个封装一个多线程组件框架的想法,只需要传入自定义任务等参数,其它东西都不需要关心。

使用示例如下:源码地址
1、引入依赖。

<dependency>
    <groupId>io.github.vipjoey</groupId>
    <artifactId>mmc-juc</artifactId>
    <version>1.0</version>
</dependency>

2、使用示例。


// 创建一个MmcTaskExecutor实例,用于执行单次长耗时任务
// 下面是创建一个计算从1加到100的任务,总共100个任务,采用fork分治算法,阈值为10,总共任务为100 / 10 * 2 = 20个大任务,执行速率约为10/s
MmcTaskExecutor<Integer, Integer> mmcTaskExecutor = MmcTaskExecutor.<Integer, Integer>builder()
        .taskSource(IntStream.rangeClosed(1, 100).boxed().collect(Collectors.toList())) // 设置任务源
        .taskProcessor(x -> x.stream().reduce(0, Integer::sum)) // 设置任务处理方法
        .taskMerger(Integer::sum) // 设置结果处理方法(可选)
        .threshold(10) // 设置任务处理阈值(可选)
        .taskName("mmcTaskExample") // 设置任务名称
        .rateLimiter(10, 20)  // 设置速率限制,容量为10,每秒产生令牌为20,休眠时间为10ms
        .forkJoinPoolConcurrency(4) // 设置ForkJoinPool的并发度为4
        .build();

// 同步执行并打印结果        
System.out.println("result: " + mmcTaskExecutor.execute());

// 任务执行过程监控
[mmcTaskExample] Tasks submitted. Total tasks: 100
[mmcTaskExample] Task started. Completed tasks: 14, remaining tasks: 86
[mmcTaskExample] Task started. Completed tasks: 14, remaining tasks: 86
[mmcTaskExample] Task started. Completed tasks: 20, remaining tasks: 80
[mmcTaskExample] Task started. Completed tasks: 26, remaining tasks: 74
[mmcTaskExample] Task started. Completed tasks: 33, remaining tasks: 67
[mmcTaskExample] Task started. Completed tasks: 40, remaining tasks: 60
[mmcTaskExample] Task started. Completed tasks: 46, remaining tasks: 54
[mmcTaskExample] Task started. Completed tasks: 52, remaining tasks: 48
[mmcTaskExample] Task started. Completed tasks: 58, remaining tasks: 42
[mmcTaskExample] Task started. Completed tasks: 64, remaining tasks: 36
[mmcTaskExample] Task started. Completed tasks: 70, remaining tasks: 30
[mmcTaskExample] Task started. Completed tasks: 76, remaining tasks: 24
[mmcTaskExample] Task started. Completed tasks: 82, remaining tasks: 18
[mmcTaskExample] Task started. Completed tasks: 88, remaining tasks: 12
[mmcTaskExample] Task started. Completed tasks: 94, remaining tasks: 6
[mmcTaskExample] Task started. Completed tasks: 100, remaining tasks: 0
[mmcTaskExample] Tasks completed. Elapsed time: 1107 ms 
result: 5050

二、第三轮对话-补充异步执行代码

1、由于提交任务有可能是同步的也有可能是异步的,我们需要这个能力,所以让AI补充一下。
在这里插入图片描述

2、下面是AI给的回复。

  • 【根据您的要求,我们将在MmcTaskExecutor类中添加commit方法以支持异步执行任务。同时,我们将创建一个回调接口MmcTaskCallback,用于在异步执行完成时获取结果。】

  • 【首先,我们创建一个MmcTaskCallback接口。】

public interface MmcTaskCallback<R> {
    void onComplete(R result);
}
  • 【接下来,我们修改MmcTaskExecutor类以添加commit方法和支持回调。】
import java.util.List;
import java.util.concurrent.ForkJoinPool;

public class MmcTaskExecutor<T, R> {
    private List<T> taskSource;
    private MmcTaskProcessor<T, R> taskProcessor;
    private MmcTaskMerger<R> taskMerger;
    private int threshold;
    private ForkJoinPool forkJoinPool;

    private MmcTaskExecutor(Builder<T, R> builder) {
        this.taskSource = builder.taskSource;
        this.taskProcessor = builder.taskProcessor;
        this.taskMerger = builder.taskMerger;
        this.threshold = builder.threshold;
        this.forkJoinPool = builder.forkJoinPool;
    }

    public static <T, R> Builder<T, R> builder() {
        return new Builder<>();
    }

    // 同步执行并返回结果
    public R execute() {
        MmcTask<T, R> mmcTask = new MmcTask<>(taskSource, taskProcessor, taskMerger, threshold, 0, taskSource.size());
        return forkJoinPool.invoke(mmcTask);
    }

    // 异步执行
    public void commit() {
        commit(null);
    }

    // 异步执行并获取结果
    public void commit(MmcTaskCallback<R> callback) {
        MmcTask<T, R> mmcTask = new MmcTask<>(taskSource, taskProcessor, taskMerger, threshold, 0, taskSource.size());
        forkJoinPool.submit(() -> {
            R result = mmcTask.invoke();
            if (callback != null) {
                callback.onComplete(result);
            }
        });
    }

    // ...省略Builder类代码
}
  • 【现在您可以使用commit方法异步执行任务,并通过回调函数获取结果。以下是一个示例,演示如何异步计算从1加到100的结果并在完成时输出结果。】
import java.util.ArrayList;
import java.util.List;

public class MmcTaskExample {
    public static void main(String[] args) {
        List<Integer> taskSource = new ArrayList<>();
        for (int i = 1; i <= 100; i++) {
            taskSource.add(i);
        }

        MmcTaskProcessor<Integer, Integer> taskProcessor = new MmcTaskProcessor<Integer, Integer>() {
            @Override
            public Integer process(List<Integer> taskSource) {
                int sum = 0;
                for (Integer num : taskSource) {
                    sum += num;
                }
                return sum;
            }
        };

        MmcTaskMerger<Integer> taskMerger = new MmcTaskMerger<Integer>() {
            @Override
            public Integer merge(Integer leftResult, Integer rightResult) {
                return leftResult + rightResult;
            }
        };

        MmcTaskExecutor<Integer, Integer> mmcTaskExecutor = MmcTaskExecutor.<Integer, Integer>builder()
                .taskSource(taskSource)
                .taskProcessor(taskProcessor)
                .taskMerger(taskMerger)
                .threshold(10)
                .build();

        mmcTaskExecutor.commit(result -> System.out.println("异步执行结果:" + result));  // 输出5050

        // 等待异步任务完成,防止主线程提前退出
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

这次诉求改动不大,AI回答也很完美,我们继续优化!

三、第四轮对话-增加限流器

1、因为有些任务不能执行过快,例如刷DB数据或者远程接口调用等,需要补充限流功能。
在这里插入图片描述

2、下面是AI大模型给的回复。

  • 【为了支持速率控制,我们将使用令牌桶算法实现速率限制。首先,我们需要创建一个令牌桶类TokenBucket,然后在MmcTaskExecutor类中使用它来控制任务的执行速度。首先,我们创建一个TokenBucket类。】
public class TokenBucket {
    private final long capacity;
    private final long tokensPerSecond;
    private long tokens;
    private long lastRefillTimestamp;

    public TokenBucket(long capacity, long tokensPerSecond) {
        this.capacity = capacity;
        this.tokensPerSecond = tokensPerSecond;
        this.tokens = capacity;
        this.lastRefillTimestamp = System.nanoTime();
    }

    public synchronized boolean tryConsume() {
        refill();

        if (tokens > 0) {
            tokens--;
            return true;
        }

        return false;
    }

    private void refill() {
        long now = System.nanoTime();
        long elapsedTime = now - lastRefillTimestamp;
        long tokensToAdd = (elapsedTime * tokensPerSecond) / 1_000_000_000;
        if (tokensToAdd > 0) {
            tokens = Math.min(capacity, tokens + tokensToAdd);
            lastRefillTimestamp = now;
        }
    }
}
  • 【接下来,我们修改MmcTaskExecutor类以支持速率控制。】
import java.util.List;
import java.util.concurrent.ForkJoinPool;

public class MmcTaskExecutor<T, R> {
    private List<T> taskSource;
    private MmcTaskProcessor<T, R> taskProcessor;
    private MmcTaskMerger<R> taskMerger;
    private int threshold;
    private ForkJoinPool forkJoinPool;
    private TokenBucket tokenBucket; // 添加令牌桶成员变量

    private MmcTaskExecutor(Builder<T, R> builder) {
        this.taskSource = builder.taskSource;
        this.taskProcessor = builder.taskProcessor;
        this.taskMerger = builder.taskMerger;
        this.threshold = builder.threshold;
        this.forkJoinPool = builder.forkJoinPool;
        this.tokenBucket = builder.tokenBucket;
    }

    public static <T, R> Builder<T, R> builder() {
        return new Builder<>();
    }

    // ...省略其他方法

    public static class Builder<T, R> {
        private List<T> taskSource;
        private MmcTaskProcessor<T, R> taskProcessor;
        private MmcTaskMerger<R> taskMerger;
        private int threshold = 10;
        private ForkJoinPool forkJoinPool = new ForkJoinPool();
        private TokenBucket tokenBucket; // 添加令牌桶成员变量

        public Builder<T, R> taskSource(List<T> taskSource) {
            this.taskSource = taskSource;
            return this;
        }

        // ...省略其他方法

        public Builder<T, R> rateLimiter(long capacity, long tokensPerSecond) {
            this.tokenBucket = new TokenBucket(capacity, tokensPerSecond);
            return this;
        }

        public MmcTaskExecutor<T, R> build() {
            return new MmcTaskExecutor<>(this);
        }
    }
}
  • 【然后,我们需要修改MmcTask类以在处理任务之前尝试消耗令牌。】
import java.util.List;
import java.util.concurrent.RecursiveTask;

public class MmcTask<T, R> extends RecursiveTask<R> {
    // ...省略其他成员变量
    private TokenBucket tokenBucket;

    public MmcTask(List<T> taskSource, MmcTaskProcessor<T, R> taskProcessor, MmcTaskMerger<R> taskMerger, int threshold, int start, int end, TokenBucket tokenBucket) {
        // ...省略其他初始化代码
        this.tokenBucket = tokenBucket;
    }

    @Override
    protected R compute() {
        // 在处理任务之前尝试消耗令牌
        while (!tokenBucket.tryConsume()) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        // ...省略其他代码
    }
}
  • 【现在,您可以使用rateLimiter方法设置容器的速率限制。以下是一个示例,演示如何使用速率限制计算从1加到100的结果。】
import java.util.ArrayList;
import java.util.List;

public class MmcTaskExample {
    public static void main(String[] args) {
        List<Integer> taskSource = new ArrayList<>();
        for (int i = 1; i <= 100; i++) {
            taskSource.add(i);
        }

        MmcTaskProcessor<Integer, Integer> taskProcessor = new MmcTaskProcessor<Integer, Integer>() {
            @Override
            public Integer process(List<Integer> taskSource) {
                int sum = 0;
                for (Integer num : taskSource) {
                    sum += num;
                }
                return sum;
            }
        };

        MmcTaskMerger<Integer> taskMerger = new MmcTaskMerger<Integer>() {
            @Override
            public Integer merge(Integer leftResult, Integer rightResult) {
                return leftResult + rightResult;
            }
        };

        MmcTaskExecutor<Integer, Integer> mmcTaskExecutor = MmcTaskExecutor.<Integer, Integer>builder()
                .taskSource(taskSource)
                .taskProcessor(taskProcessor)
                .taskMerger(taskMerger)
                .threshold(10)
                .rateLimiter(10, 1)  // 设置速率限制
                .build();

        Integer result = mmcTaskExecutor.execute();
        System.out.println(result);  // 输出5050
    }
}
  • 【在这个示例中,我们使用rateLimiter方法设置了速率限制,每秒只能处理1个任务。然后我们使用execute方法执行任务并输出结果。因为我们设置了速率限制,所以执行任务的速度会受到限制。】

四、第五轮对话-抽取限流器接口

1、从AI大模型给出的代码来看,基本符合我们的诉求,不过也存在一下问题:

我希望任务限流器可以使用第三方例如Guava RateLimiter这些工具去限流,在工具里写死是不太合适的,我们继续让它修改。
在这里插入图片描述
2、下面是AI的回复。

  • 【为了支持第三方速率限制器,我们需要创建一个速率限制器接口RateLimiter,并将TokenBucket类实现此接口。然后,我们在MmcTaskExecutor类中使用RateLimiter接口,而不是直接使用TokenBucket类。首先,我们创建一个RateLimiter接口。】
public interface RateLimiter {
    boolean tryConsume();
}
  • 【接下来,我们修改TokenBucket类以实现RateLimiter接口。】
public class TokenBucket implements RateLimiter {
    // ...省略其他代码

    @Override
    public boolean tryConsume() {
        // ...省略其他代码
    }

    // ...省略其他代码
}
  • 【然后,我们修改MmcTaskExecutor类以使用RateLimiter接口。】
import java.util.List;
import java.util.concurrent.ForkJoinPool;

public class MmcTaskExecutor<T, R> {
    // ...省略其他成员变量
    private RateLimiter rateLimiter; // 使用RateLimiter接口

    private MmcTaskExecutor(Builder<T, R> builder) {
        // ...省略其他初始化代码
        this.rateLimiter = builder.rateLimiter;
    }

    // ...省略其他方法

    public static class Builder<T, R> {
        // ...省略其他成员变量
        private RateLimiter rateLimiter = new TokenBucket(10, 1); // 默认使用TokenBucket

        // ...省略其他方法

        public Builder<T, R> rateLimiter(RateLimiter rateLimiter) {
            this.rateLimiter = rateLimiter;
            return this;
        }

        // ...省略其他方法
    }
}

这次AI大模型的回复也很完美,是不是很棒?我们继续优化。

五、第六轮对话-修改并发度

1、由于ForkJoinPool默认是线程池的数量核心数-1,但有时候我们需要自定义去定义线程数量来控制并发度,也就是任务处理速度。
在这里插入图片描述
2、以下是AI的回复。

  • 【为了支持修改容器ForkJoinPool的默认并发度,我们可以在MmcTaskExecutor.Builder类中添加一个方法,允许用户设置并发度。修改MmcTaskExecutor类的Builder以添加设置并发度的方法:】
import java.util.List;
import java.util.concurrent.ForkJoinPool;

public class MmcTaskExecutor<T, R> {
    // ...省略其他成员变量和方法

    public static class Builder<T, R> {
        // ...省略其他成员变量和方法

        public Builder<T, R> forkJoinPoolConcurrency(int concurrency) {
            this.forkJoinPool = new ForkJoinPool(concurrency);
            return this;
        }

        // ...省略其他方法
    }
}
  • 【现在,您可以使用forkJoinPoolConcurrency方法设置ForkJoinPool的并发度。以下是一个示例,演示如何设置并发度为4。】
import java.util.ArrayList;
import java.util.List;

public class MmcTaskExample {
    public static void main(String[] args) {
        List<Integer> taskSource = new ArrayList<>();
        for (int i = 1; i <= 100; i++) {
            taskSource.add(i);
        }

        MmcTaskProcessor<Integer, Integer> taskProcessor = new MmcTaskProcessor<Integer, Integer>() {
            @Override
            public Integer process(List<Integer> taskSource) {
                int sum = 0;
                for (Integer num : taskSource) {
                    sum += num;
                }
                return sum;
            }
        };

        MmcTaskMerger<Integer> taskMerger = new MmcTaskMerger<Integer>() {
            @Override
            public Integer merge(Integer leftResult, Integer rightResult) {
                return leftResult + rightResult;
            }
        };

        MmcTaskExecutor<Integer, Integer> mmcTaskExecutor = MmcTaskExecutor.<Integer, Integer>builder()
                .taskSource(taskSource)
                .taskProcessor(taskProcessor)
                .taskMerger(taskMerger)
                .threshold(10)
                .rateLimiter(new TokenBucket(10,20)) // 设置速率限制
                .forkJoinPoolConcurrency(4) // 设置ForkJoinPool的并发度为4
                .build();

        Integer result = mmcTaskExecutor.execute();
        System.out.println(result);  // 输出5050
    }
}

下一篇,继续优化这个多线程框架。。。

三、参考文章

  • 《AI大模型编写多线程并发框架(六十一):从零开始搭建框架》
  • 《AI大模型编写多线程并发框架(六十二):限流和并发度优化》
  • 《AI大模型编写多线程并发框架(六十三):监听器优化》
  • 《AI大模型编写多线程并发框架(六十四):发布和应用》

加我加群(备注csdn)一起交流学习!更多干货下载、项目源码和大厂内推等着你

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

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

相关文章

何为MethodHandles?

最近在梳理ThreadPoolExecutor&#xff0c;无意间看到其内部类Worker实现了一个名字叫做AbstractQueuedSynchronizer的抽象类。看到它&#xff0c;我便想起当年为了面试而疯狂学习这个知识点的场景。不过这种临时抱佛脚的行为&#xff0c;并未给我带来即时的收益。也是这次的疯…

基于Java的高校学生工作系统的设计与实现(论文+源码)_kaic

基于Java的高校学生工作系统的设计与实现(论文源码)_kaic 摘 要 本系统为高校学生工作管理系统&#xff0c;系统能够为高校提供便捷的学生信息管理功能。该系统采用 Java 语言编写&#xff0c;系统采用MVC架构进行设计&#xff0c;通过Servlet和JSP等技术实现前后端数据交互和…

【漏洞复现】SuiteCRM responseEntryPoint Sql注入漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

基于UDS的Flash 刷写——BootLoad刷写流程详解

从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者&#xff0c;时光不负有心人。 目录 流程概述UDS流程详解释前编程①诊断会话控制 - 切换到扩展会话&#xff08;10 03&#xff09;②例程控制-预编程条件检查&#xff08;31 01 02 03&#xff09;③DTC…

ClickHouse分布式部署搭建单分片二副本集群

搭建单分片二副本集群,使用MergeTree引擎测试数据同步 服务器: 127.0.0.1 clickhouse 127.0.0.2 clickhouse + keeper 结构图 1.修改hosts vi /etc/hosts 添加需要部署的ip和名字 127.0.0.1 node1 127.0.0.2 node2 2. node1配置文件修改 2.1 修改/etc/clickhouse-se…

Excel中使用VBS自定义函数将中文转为拼音首字母

1、在“开发工具”中&#xff0c;点击“Visual Basic”。如果没有“开发工具”&#xff0c;则添加。 2、添加“模块”&#xff0c;在窗口中添加自定义函数。 Function MyGetPYChar(char) MyCodeNumber 65536 Asc(char) If (MyCodeNumber > 45217 And MyCodeNumber <…

【网络安全】缓存配置错误导致授权绕过

未经许可,不得转载。 文章目录 正文复现正文 一个电子商务网站,它有 2 个资产:target.com和admin.target.com target.com是面向用户的门户,用户可以去那里购买物品。admin.target.com是卖家的管理门户,卖家可以在其中列出他们的物品,跟踪订单、客户信息等。 我正在测试…

有希带你深入理解指针(3)

前言 本篇文章是对指针知识的进一步讲解&#xff0c;如果对部分知识有不了解的地方可以移步前文进行学习&#xff01; 1.字符指针变量 该内容我们在前面的文章中已提到过&#xff0c;想必大家对它应该不陌生吧&#xff01;这里我们会对它进行详细的介绍。 一般情况下&#xf…

FPGA开发——IIC实现简单的串口回环

一、概述 在我们进行日常开发时&#xff0c;不管是进行MCU、单片机、还是FPGA&#xff0c;都会使用到IIC通信协议。采用串行总线可以简化系统硬件结构、减小系统体积、提高系统可靠性。常 用的串行总线有单总线&#xff08;1-Wire Bus&#xff09;、IIC&#xff08;Inter-Integ…

Codeforces Round 926 (Div. 2) C. Sasha and the Casino (博弈论*1400)

这里的意思是想让我们求得是否是能够实现不停地无上限的赚钱。 这里注意避开一个思维误区&#xff0c;如果你想的是前x次一直用1枚硬币然后吃第x1次保底&#xff0c;那么就是错误的。你应该考虑到如果前x次里面出现了胜利呢&#xff1f;这时候你拿着一枚硬币根本赚不回本。 所…

全志H616系统启动和登录

一、系统启动 刷完机烧入镜像&#xff0c;直接用MobaXterm软件串口登陆 约定固定的波特率115200。 默认登录&#xff1a; 用户&#xff1a;orangepi 密码&#xff1a;orangepi 或用户&#xff1a;root 密码&#xff1a;orangepi 在输入密码时…

YOLO 单目测距:原理、方法与代码

一、原理 单目测距的一个常见方法是假设物体的尺寸已知。通过测量物体在图像中的高度&#xff08;或宽度&#xff09;&#xff0c;并结合物体的实际高度&#xff08;或宽度&#xff09;&#xff0c;最简单的一种方式就是利用相似三角形的原理来计算物体的距离。 二、相似三角…

使用深度学习来进行击剑动作识别的裁判工作

在击剑比赛中&#xff0c;当双方几乎同时击中对方时&#xff0c;记分板两边都会亮起。这时裁判需要决定哪一方得分。一般而言&#xff0c;谁更主动或控制了局势就会得分。我尝试训练了一个模型来辅助裁判做这样的判断&#xff01;目前该模型在花剑测试集上的准确率大约为60%&am…

Vue开发者工具安装详细教程

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、下载二、安装三、调试 前言 Vue 是一个框架&#xff0c;也是一个生态&#xff0c;其功能覆盖了大部分前端开发常见的需求。本文详细讲解了 Vue 开发者工具的安装。 …

ES7.17.5 float类型 terms带来的隐患

背景 1.用户在mapping中加一个字段 testid&#xff0c;结果写数据的时候使用 testId&#xff0c;同时也没有strict限制动态mapping&#xff0c;只是使用了默认的 true&#xff0c;即允许动态生成mapping 2.动态生成的字段 testId 被识别成了 float&#xff0c;用户为了方便&a…

【Netty 一】

Netty是什么 Netty 是一个高性能、异步事件驱动的 NIO 框架&#xff0c;基于 JAVA NIO 提供的 API 实现。它提供了对 TCP、 UDP 和文件传输的支持&#xff0c;作为一个异步 NIO 框架&#xff0c; Netty 的所有 IO 操作都是异步非阻塞 的&#xff0c; 通过 Future-Listener 机制…

ssrf漏洞之——漏洞复现

漏洞介绍 SSRF漏洞&#xff1a;SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由恶意访问者构造url&#xff0c;由服务端对此url发起请求的一个安全漏洞。 漏洞原理 SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能&#xff0c;并且没有对目…

Autosar(Davinci) --- 创建一个Implementation Data Types

前言 这里我们讲一下如何创建一个Implementation Data Types&#xff08;IDT) 一、什么是IDT 二、如何创建一个IDT 鼠标右键【Implementation Data Types】,选择【new Type Reference...】 起一个名字【IdtDoorState】&#xff0c;Data Types选择【boolean】&#xff0c;这里…

RFID光触发标签应用于制造业供应链管理的应用与探索

制造业作为国民经济的支柱产业&#xff0c;其供应链管理的复杂性和重要性日益凸显&#xff0c;在全球化竞争的背景下&#xff0c;企业需要更高效、更精准、更智能的供应链解决方案来满足市场需求&#xff0c;提高客户满意度&#xff0c;降低运营成本&#xff0c;RFID光触发标签…

【mysql】mysql的卸载和安装

mysql的卸载 mysql是否安装&#xff1a; 首先我们先来看看mysql是否安装&#xff1a; 快捷键winR输入cmd&#xff0c;进入命令输入框 输入mysql --version 查看mysql的版本 如果出现了mysql的版本就说明你已经安装了 系统用户root -p就是输入密码所以代码如下 mysql -ur…