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

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir)

文章目录

    • 参考文章
    • 目录结构
    • 步骤
      • 安装venv
      • 查看python版本
      • 创建虚拟环境
      • 激活虚拟环境
      • 运行我们程序看缺少哪些依赖库,依次安装它们
      • 接下来我们配置python程序启动脚本,脚本中启动python程序前需先激活虚拟环境
      • 配置.service文件
      • 然后执行部署脚本,成功了
      • 但是又莫名其妙搞出来一个问题,后面一直不能复现,后来又好了,一直无法复现(考虑问题复现时,使用备用方案)
      • 反正现在是正常的
    • 20230811 虚拟环境中搞jtop(jetson-stats)还是有亿点问题

参考文章

Python虚拟环境使用教程(以虚拟环境管理工具venv为例)(virtualenv、venv、pyenv、virtualenvwrapper、conda不同管理工具对比)

目录结构

在这里插入图片描述

步骤

安装venv

它会基于当前版本的python3来安装python3-venv

在这里插入图片描述

apt update && apt install python3.8-venv

查看python版本

执行python

在这里插入图片描述

创建虚拟环境

进入项目目录,执行:

python3 -m venv .venv-python3.8

(我把每个项目虚拟环境固定取名为.venv-python3.8,后续方便脚本操作)

20230813:改了,不这么搞了,容易混淆,每个虚拟环境都应该有自己特定的名字:

python3 -m venv .venv-python3.8-ky_ai_ip_change

在这里插入图片描述

可以看到,生成了目录.venv-python3.8

我这刚生成的虚拟环境占空间也不大,才7兆多:

在这里插入图片描述

激活虚拟环境

source .venv-python3.8/bin/activate

在这里插入图片描述

运行我们程序看缺少哪些依赖库,依次安装它们

执行:

python3 ip_change

在这里插入图片描述

发现少了ping3,装上:

pip install ping3

在这里插入图片描述

反复执行:

python3 ip_change

缺少啥库就装啥库:

在这里插入图片描述

下载太慢,我换成清华源,怎么还给我卡住了?

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent

20230813:如果有requirements.txt文件,可以直接:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

可以禁用缓存,因为缓存可能会导致大问题(比如缓存里有但是是用之前正确的方式下载的,当前下载方式不正确但用缓存也成功了,就会导致下载者误判):

pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

在这里插入图片描述

第二天看,好了:

在这里插入图片描述

继续:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

可以了,跑起来了,接口也能调通:

在这里插入图片描述
在这里插入图片描述

接下来我们配置python程序启动脚本,脚本中启动python程序前需先激活虚拟环境

注意journalctl -u <servicename>没有及时打印python日志的原因是因为在systemd unit文件中执行shell脚本,脚本中再执行python命令,命令没加-u参数导致的。估计是systemd自动把shell脚本输出重定向到journalctl日志,跟我们之前遇到的问题一样

ky_ai_ip_change.sh

#!/bin/bash# 打印所有,包括注释
# set -v
# 打印执行命令
# set -x
# 命令出错退出
set -e
# 使用未初始化变量退出
set -uUSER="root"# --------------------------------------------------------------------------# 检查是否是root
WHO=$(whoami | grep "${USER}$")
if [ -z "${WHO}" ]; thenechoecho "Please change to \"${USER}\" user mode first!"echoexit 1
fi# --------------------------------------------------------------------------# 获取脚本所在路径
SCRIPT_LOCATION=$(cd "$(dirname "$0")" || {echo "cd Failure"exit 1}pwd
)
echo "SCRIPT_LOCATION = $SCRIPT_LOCATION"# --------------------------------------------------------------------------VENV_NAME=".venv-python3.8"
PYTHON_ENTRY_FILE="ip_change"# --------------------------------------------------------------------------# 激活虚拟环境
# 加指令注释消除shellcheck警告,source后有变量就会警告
# shellcheck source=/ky/tml/ky_ai_ip_change/.venv-python3.8/bin/activate
source $SCRIPT_LOCATION/$VENV_NAME/bin/activate
if [ $? -ne 0 ]; thenecho "Execute [source $SCRIPT_LOCATION/$VENV_NAME/bin/activate] failed"exit 1
fi# 运行项目
# python -u $SCRIPT_LOCATION/$PYTHON_ENTRY_FILE
# if [ $? -ne 0 ]; then
#     echo "Execute [python $SCRIPT_LOCATION/$PYTHON_ENTRY_FILE] failed"
#     exit 1
# fi# 改一改,避免命令报错直接退出脚本,没有机会退出虚拟环境
if python -u $SCRIPT_LOCATION/$PYTHON_ENTRY_FILE; thenecho "命令 [python -u $SCRIPT_LOCATION/$PYTHON_ENTRY_FILE] 执行成功"
elseecho "命令 [python -u $SCRIPT_LOCATION/$PYTHON_ENTRY_FILE] 执行失败"
fideactivate
if [ $? -ne 0 ]; thenecho "Execute [deactivate] failed,退出虚拟环境失败"exit 1
fi
echo "Execute [deactivate] successfully,退出虚拟环境成功"

配置.service文件

ky_ai_ip_change.service

[Unit]
Description=ky_ai_ip_change
After=network.target[Service]
ExecStart=/ky/tml/ky_ai_ip_change/ky_ai_ip_change.sh
WorkingDirectory=/ky/tml/ky_ai_ip_change
Restart=always
RestartSec=3[Install]
WantedBy=default.target

然后执行部署脚本,成功了

install.sh

#!/bin/bash# 打印所有,包括注释
# set -v
# 打印执行命令
# set -x
# 命令出错退出
set -e
# 使用未初始化变量退出
set -uUSER=root
# USER_HOME=/root# --------------------------------------------------------------------------# 检查是否是root
WHO=$(whoami | grep "${USER}$")
if [ -z "${WHO}" ]; thenechoecho "Please change to \"${USER}\" user mode first!"echoexit 1
fi# --------------------------------------------------------------------------# 获取脚本所在路径
SCRIPT_LOCATION=$(cd "$(dirname "$0")" || {echo "cd Failure"exit 1}pwd
)
# echo "SCRIPT_LOCATION = $SCRIPT_LOCATION"
chmod 777 ${SCRIPT_LOCATION} -R# --------------------------------------------------------------------------# 不同服务只用改 SERVICE_NAME 变量即可
SERVICE_NAME="ky_ai_ip_change"
SERVICE_FILE_NAME="$SERVICE_NAME.service"SERVICE_SOURCE_FILE_PATH="$SCRIPT_LOCATION/$SERVICE_FILE_NAME"# 不能在 /etc/systemd/system 中创建子目录吗?(貌似是的,测试很多次都不行)
# SERVICE_TARGET_DIR_NAME="ky_ai_service"
# SERVICE_TARGET_DIR_PATH="/etc/systemd/system/$SERVICE_TARGET_DIR_NAME"
SERVICE_TARGET_DIR_PATH="/etc/systemd/system"# --------------------------------------------------------------------------# 创建目标目录
# if [ ! -d "$SERVICE_TARGET_DIR_PATH" ]; then
#     mkdir -p "$SERVICE_TARGET_DIR_PATH"
#     echo "创建目录:[$SERVICE_TARGET_DIR_PATH]"
# else
#     echo "目录已存在,不重新创建:[$SERVICE_TARGET_DIR_PATH]"
# fi
# chmod 777 "$SERVICE_TARGET_DIR_PATH" -R# --------------------------------------------------------------------------# 判断服务是否存在
if systemctl list-unit-files --type=service | grep -q "$SERVICE_NAME"; thenecho "$SERVICE_NAME.service exists"# 打印服务状态# systemctl status $SERVICE_NAMEecho# 这句明明是打印居然会触发 set -e 报错退出,加上 || true# systemctl status $SERVICE_NAME || true# 貌似信息比较长时,会有分页等待用户输入阻塞程序,加上 --no-pager 选项systemctl status $SERVICE_NAME --no-pager || trueecho# 询问用户是否删除read -p "Do you want to delete $SERVICE_NAME.service? (y/n): " choiceif [[ $choice == "y" || $choice == "Y" ]]; then# 删除服务systemctl stop $SERVICE_NAMEecho "已 stop [$SERVICE_NAME] 服务 "systemctl disable $SERVICE_NAMEecho "已 disable [$SERVICE_NAME] 服务"# rm /etc/systemd/system/$SERVICE_NAME.service  # 不用删,会自动删的systemctl daemon-reloadecho "已 daemon-reload"echo "$SERVICE_NAME.service has been deleted"elseecho "Exiting script"exit 0fi
elseecho "$SERVICE_NAME.service not exists"
fi
echo# --------------------------------------------------------------------------# 这句明明是打印居然会触发 set -e 报错退出
# systemctl list-unit-files | grep "$SERVICE_NAME"
# systemctl list-unit-files | grep "$SERVICE_NAME" || true# --------------------------------------------------------------------------# Function: create_symlink
# Description: Check if a symlink exists and is valid. If it is valid, prompt the user to delete and relink it.
#              If it is invalid, display an error message. If it does not exist, create a new symlink.
# Parameters:
#   $1 - The target path of the symlink
#   $2 - The path of the symlink
# Returns:
#   Nonefunction create_symlink() {SRC=$1LINK=$2if [ -e $LINK ]; thenif [ -L $LINK ]; thenecho "The symlink $LINK is valid."read -p "Do you want to delete and relink it? (y/n) " choicecase "$choice" iny | Y)rm $LINKecho "The symlink $LINK has been deleted.";;*)return 0;;esacelseecho "The symlink $LINK is invalid."fifiecho "Force create soft link: [$LINK -> $SRC]"ln -sf $SRC $LINKif [ $? -ne 0 ]; thenecho "Force create soft link: [$LINK -> $SRC] failed"exit 1fils -l --color=auto $LINK
}# --------------------------------------------------------------------------# 判断软链接/usr/local/bin/node是否存在,如果存在,判断软链接是否有效,如果有效,询问用户是否删除,如果用户选择是,则删除此软链接,并重新创建
SERVICE_TARGET_FILE_PATH="$SERVICE_TARGET_DIR_PATH/$SERVICE_FILE_NAME"
# ls -l --color=auto $NODE_LINK
create_symlink $SERVICE_SOURCE_FILE_PATH $SERVICE_TARGET_FILE_PATH
echo# --------------------------------------------------------------------------# 通知systemd重新加载配置文件
systemctl daemon-reload
if [ $? -ne 0 ]; thenecho "Systemctl daemon-reload failed"exit 1
fi
echo "Daemon-reload successfully"# 启用服务
systemctl enable $SERVICE_NAME
if [ $? -ne 0 ]; thenecho "Enable service [$SERVICE_NAME] failed"exit 1
fi
echo "Enable service [$SERVICE_NAME] successfully"# 启动服务
systemctl start $SERVICE_NAME
if [ $? -ne 0 ]; thenecho "Start service [$SERVICE_NAME] failed"exit 1
fi
echo "Start service [$SERVICE_NAME] successfully"# --------------------------------------------------------------------------echo
# systemctl status $SERVICE_NAME || true
# 貌似信息比较长时,会有分页等待用户输入阻塞程序,加上 --no-pager 选项
systemctl status $SERVICE_NAME --no-pager || true# --------------------------------------------------------------------------echo
echo "Service [$SERVICE_FILE_NAME] install successfully"
echo

但是又莫名其妙搞出来一个问题,后面一直不能复现,后来又好了,一直无法复现(考虑问题复现时,使用备用方案)

参考文章:Current command vanished from the unit file, execution of the command list won‘t be resumed.

后面如果又碰到,可以考虑直接systemd unit文件中直接执行python指令而不是脚本,同时定义ExecStartPreExecStopPost执行指令前的激活虚拟环境和退出虚拟环境的操作:


如果使用systemd来执行Python服务,可以在service配置文件中设置ExecStartPreExecStopPost来在执行前进入虚拟环境,执行后退出虚拟环境。

以下是一个示例的service配置文件,展示了如何在执行前进入虚拟环境,执行后退出虚拟环境:

[Unit]
Description=My Python Service[Service]
ExecStartPre=/bin/bash -c 'source /path/to/venv/bin/activate'
ExecStart=/path/to/python /path/to/script.py
ExecStopPost=/bin/bash -c 'deactivate'[Install]
WantedBy=multi-user.target

在这个示例中,ExecStartPre指定了在执行前要执行的命令,即进入虚拟环境的命令source /path/to/venv/bin/activateExecStart指定了要执行的Python脚本的路径。ExecStopPost指定了在执行后要执行的命令,即退出虚拟环境的命令deactivate

请将/path/to/venv替换为你的虚拟环境的路径,将/path/to/python替换为你的Python解释器的路径,将/path/to/script.py替换为你的Python脚本的路径。

通过这样的配置,当你启动或停止该service时,会自动进入和退出虚拟环境。

反正现在是正常的

在这里插入图片描述
在这里插入图片描述

20230811 虚拟环境中搞jtop(jetson-stats)还是有亿点问题

pip3 install -U jetson-stats

在这里插入图片描述

在这里插入图片描述

相关文章:

ubuntu python虚拟环境venv搭配systemd服务实战(禁用缓存下载--no-cache-dir)

文章目录 参考文章目录结构步骤安装venv查看python版本创建虚拟环境激活虚拟环境运行我们程序看缺少哪些依赖库&#xff0c;依次安装它们接下来我们配置python程序启动脚本&#xff0c;脚本中启动python程序前需先激活虚拟环境配置.service文件然后执行部署脚本&#xff0c;成功…...

案例15 Spring Boot入门案例

1. 选择Spring Initializr快速构建项目 ​ 2. 设置项目信息 ​ 3. 选择依赖 ​ 4. 设置项目名称 ​ 5. 项目结构 ​ 6. 项目依赖 自动配置了Spring MVC、内置了Tomcat、配置了Logback(日志)、配置了JSON。 ​ 7. 创建HelloController类 com.wfit.boot.hello目录下创建HelloCo…...

物联网是下一个风口吗?

随着科技的持续进步&#xff0c;物联网行业正在迅速兴起&#xff0c;展现出巨大的潜力。那么&#xff0c;物联网行业的未来是什么样的呢&#xff1f; 1. 5G技术的广泛应用和普及 随着5G技术的快速发展和商业化推广&#xff0c;物联网行业将迎来一个巨大的飞跃。5G技术的高速传…...

8月9日上课内容 nginx反向代理与负载均衡

负载均衡工作当中用的很多的&#xff0c;也是面试会问的很重要的一个点 负载均衡&#xff1a;通过反向代理来实现&#xff08;nginx只有反向代理才能做负载均衡&#xff09; 正向代理的配置方法&#xff08;用的较少&#xff09; 反向代理的方式&#xff1a;四层代理与七层代…...

易服客工作室:Elementor AI简介 – 彻底改变您创建网站的方式

Elementor 作为领先的 WordPress 网站构建器&#xff0c;是第一个添加本机 AI 集成的。Elementor AI 的第一阶段将使您能够生成和改进文本和自定义代码&#xff08;HTML、自定义代码和自定义 CSS&#xff09;。我们还已经在进行以下阶段的工作&#xff0c;其中将包括基于人工智…...

ClickHouse的数据类型

1.整数型 固定长度的整型&#xff0c;包括有符号整型或无符号整型。整型范围&#xff08;-2n-1~2n-1-1&#xff09;&#xff1a; Int8 - [-128 : 127] Int16 - [-32768 : 32767] Int32 - [-2147483648 : 2147483647] Int64 - [-9223372036854775808 : 9223372036854775807]无符…...

计算机网络—IP

这里写目录标题 IP的基本认识网络层与数据链路层有什么关系IP地址基础知识IP 地址的分类什么是A、B、C类地址广播地址用来做什么什么是D、E类广播多播地址用于什么IP分类的优点IP分类的缺点 无分类地址CIDR如何划分网络号和主机号怎么进性子网划分 公有 IP 地址与私有 IP 地址公…...

Java 的 Stream

一、创建 Stream 1.1、创建 Stream 流 1.1.1、List 集合获取 Stream 流 Collection<String> list new ArrayList<>(); Stream<String> s1 list.stream(); 1.1.2、Map 集合获取 stream 流 Map<String, Integer> map new HashMap<>(); // …...

SolidUI社区-Discord

背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目&#xff0c;旨在将自然语言处理&#xff08;NLP&#xff09;与计算机图形学相…...

Spring MVCSpring Boot

文章目录 Spring MVC什么是MVC模式Spring MVC优点SpringMVC 运行流程SpringMVC组件SpringMVC常用的注解有哪些SpringMVC的拦截器和过滤器有什么区别&#xff1f;执行顺序是什么 SpringBoot对SpringBoot的理解Spring和SpringBoot的关系&#xff1f;SpringBoot有哪些核心注解Spri…...

01-集群安装JDK(普通用户)

机器部署 集群规划 我们准备三台服务器kk01、kk02、kk03&#xff0c;内存4G、硬盘50G、处理器4核心2内核&#xff08;总8&#xff09; kk01使用 192.168.188.128 kk02使用 192.168.188.129 kk03使用 192.168.188.130 模板机准备 我们先创建一台作为模板机&#xff0c;后…...

小龟带你妙写排序之选择排序

选择排序 一. 原理二. 题目三. 思路分析四. 代码 一. 原理 选择排序(Selection-sort)是一种简单直观的排序算法。 工作原理&#xff1a;首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置&#xff0c;然后&#xff0c;再从剩余未…...

深入解析 SOCKS5 代理及其在网络安全与爬虫中的应用

在当今数字化时代&#xff0c;网络安全和数据获取成为了互联网时代的重要课题。为了实现安全的网络连接和高效的数据采集&#xff0c;各种代理技术应运而生。本文将深入探讨 SOCKS5 代理及其在网络安全和爬虫领域的应用&#xff0c;同时比较其与其他代理方式的优势与劣势。 1.…...

day9 10-牛客67道剑指offer-JZ66、19、20、75、23、76、8、28、77、78

文章目录 1. JZ66 构建乘积数组暴力解法双向遍历 2. JZ19 正则表达式匹配3. JZ20 表示数值的字符串有限状态机遍历 4. JZ75 字符流中第一个不重复的字符5. JZ23 链表中环的入口结点快慢指针哈希表 6. JZ76 删除链表中重复的结点快慢指针三指针如果只保留一个重复结点 7. JZ8 二…...

气体检测仪语音报警芯片,可自行烧录的音频芯片,WT588F02B-8S

近年来&#xff0c;安全问题备受关注&#xff0c;特别是涉及气体泄漏的危险场景。 为了进一步增强气体检测仪的安全功能&#xff0c;市面上便研发出了一款有害气体报警器&#xff0c;并采用WT588F02B-8S语音提示芯片为元器件&#xff0c;为产品赋予更多声音&#xff0c;更多警示…...

gdb 调试汇编

starti 从第一条指令开始执行并停止. nexti 执行完当前指令; 当前指令可能是call一个函数, 但是仍然下一条指令才停止; stepi 下一条指令, 如果跳转也跟着跳转; 查看寄存器值 info registers 查看通用寄存器 info registers {register_name ...}指定寄存器的值 info reg…...

WebRTC音视频通话-新增或修改SDP中的码率Bitrate限制

WebRTC音视频通话-新增或修改SDP中的码率Bitrate限制参数 之前搭建ossrs服务&#xff0c;可以查看&#xff1a;https://blog.csdn.net/gloryFlow/article/details/132257196 之前实现iOS端调用ossrs音视频通话&#xff0c;可以查看&#xff1a;https://blog.csdn.net/gloryFlo…...

深入理解与运用Android Jetpack ViewModel

在Android开发中&#xff0c;数据与界面的分离一直是一项重要的挑战。为了解决这个问题&#xff0c;Google推出了Android Jetpack组件之一的ViewModel。ViewModel是一种用于管理UI相关数据的架构组件&#xff0c;它能够帮助开发者实现优雅的数据驱动和生命周期管理。本文将深入…...

【数据库】P0 创建数据库环境 MySQL + DataGrip

创建数据库环境 下载安装 MySQL下载安装 DataGrip 下载安装 MySQL Windows版本_MySQL 下载地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 下载后依照默认顺序安装即可&#xff0c;本博文将讲述简约安装步骤&#xff1b; 如需详细安装步骤可见&#xff1a;https:/…...

js设置css变量控制页面一行展示指定个数的元素

前置知识&#xff1a; CSS变量之var()函数的应用——动态修改样式 & root的使用 flex相关知识 场景&#xff1a; 动态设置给父元素内子元素设置每行排列几个 通过 document.body.style.setProperty(--itemNum, 5)设置样式变量&#xff0c;然后通过给父元素设置display: f…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...

用js实现常见排序算法

以下是几种常见排序算法的 JS实现&#xff0c;包括选择排序、冒泡排序、插入排序、快速排序和归并排序&#xff0c;以及每种算法的特点和复杂度分析 1. 选择排序&#xff08;Selection Sort&#xff09; 核心思想&#xff1a;每次从未排序部分选择最小元素&#xff0c;与未排…...