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

os模块篇(三)

专栏目录

文章目录

  • 专栏目录
  • os.putenv(key, value, /)
  • os.setegid(egid, /)
  • os.seteuid(euid, /)
  • os.setgid(gid, /)
  • os.setgroups(groups, /)
  • os.setns(fd, nstype=0)
  • os.setpgrp()
  • os.setpgid(pid, pgrp, /)
  • os.setpriority(which, who, priority)

os.putenv(key, value, /)

os.putenv(key, value) 是 Python 中的一个方法,用于设置环境变量。这个方法属于 os 模块,该模块提供了许多与操作系统交互的功能。

os.putenv(key, value) 的参数如下:

  • key: 环境变量的名称(字符串)。
  • value: 环境变量的值(字符串)。

使用 os.putenv 设置的环境变量只影响当前进程及其子进程。当当前进程结束时,这些环境变量不会影响到其他进程或系统环境。

下面是一个简单的示例:

import os# 设置环境变量
os.putenv('MY_ENV_VAR', 'Hello, World!')# 获取并打印环境变量的值
print(os.getenv('MY_ENV_VAR'))  # 输出: Hello, World!

然而,在 Python 中更常用的方法是使用 os.environ 字典来设置和获取环境变量,因为它提供了更直观和方便的方式来操作环境变量。例如:

import os# 设置环境变量
os.environ['MY_ENV_VAR'] = 'Hello, World!'# 获取并打印环境变量的值
print(os.environ['MY_ENV_VAR'])  # 输出: Hello, World!

这两种方法(os.putenv 和 os.environ)都可以用来设置环境变量,但使用 os.environ 通常更为简洁和方便。

os.setegid(egid, /)

os.setegid(egid) 是 Python 的 os 模块中的一个函数,用于设置当前进程的有效组 ID(effective group ID)。在 Unix 和类 Unix 系统中,每个进程都有一个组 ID(group ID)和一个有效组 ID,它们通常用于确定进程对文件和其他资源的访问权限。

os.setegid(egid) 的参数是:

  • egid: 一个整数,表示要设置的有效组 ID。

请注意,只有超级用户(root)才能成功更改有效组 ID。对于非 root 用户,尝试更改有效组 ID 通常会引发 PermissionError。

使用 os.setegid() 时要小心,因为更改进程的有效组 ID 可能会影响该进程对文件系统和其他资源的访问权限。

下面是一个简单的示例,展示了如何使用 os.setegid():

import os# 获取当前进程的有效组 ID
current_egid = os.getegid()
print(f"Current effective group ID: {current_egid}")# 尝试设置新的有效组 ID
# 注意:这里假设您有足够的权限来更改有效组 ID
try:os.setegid(1000)  # 假设 1000 是您想设置的新组 IDprint("Effective group ID changed successfully.")
except PermissionError:print("Permission denied. Unable to change effective group ID.")# 再次获取并打印有效组 ID,以确认是否更改成功
new_egid = os.getegid()
print(f"New effective group ID: {new_egid}")

在上面的代码中,我们首先使用 os.getegid() 获取当前进程的有效组 ID,然后尝试使用 os.setegid() 设置一个新的有效组 ID。请注意,由于权限限制,这个操作可能会失败。最后,我们再次使用 os.getegid() 来验证有效组 ID 是否已更改。

在实际应用中,更改进程的有效组 ID 通常不是必需的,除非你正在编写需要特定权限级别的系统级程序或服务。在大多数情况下,使用标准文件 I/O 函数和文件权限管理就可以满足需求。

os.seteuid(euid, /)

os.seteuid(euid) 是 Python 的 os 模块中的一个函数,用于设置当前进程的有效用户 ID(effective user ID)。有效用户 ID 是 Unix 和类 Unix 系统中进程的一个属性,它决定了进程对文件的访问权限和其他一些系统操作的权限。

os.seteuid(euid) 的参数是:

  • euid: 一个整数,表示要设置的有效用户 ID。

和 os.setegid() 一样,只有超级用户(root)才能成功更改有效用户 ID。对于非 root 用户,尝试更改有效用户 ID 通常会引发 PermissionError。

下面是使用 os.seteuid() 的一个简单示例:

import os# 获取当前进程的有效用户 ID
current_euid = os.geteuid()
print(f"Current effective user ID: {current_euid}")# 尝试设置新的有效用户 ID
# 注意:这里假设您有足够的权限来更改有效用户 ID
try:os.seteuid(1000)  # 假设 1000 是您想设置的新用户 IDprint("Effective user ID changed successfully.")
except PermissionError:print("Permission denied. Unable to change effective user ID.")# 再次获取并打印有效用户 ID,以确认是否更改成功
new_euid = os.geteuid()
print(f"New effective user ID: {new_euid}")

在上面的代码中,我们首先使用 os.geteuid() 获取当前进程的有效用户 ID,然后尝试使用 os.seteuid() 设置一个新的有效用户 ID。和 os.setegid() 一样,由于权限限制,这个操作可能会失败。最后,我们再次使用 os.geteuid() 来验证有效用户 ID 是否已更改。

请注意,更改进程的有效用户 ID 是一个高级操作,通常只有当你需要编写需要特定权限级别的系统级程序或服务时才会这么做。在大多数情况下,应用程序不应该需要更改其有效用户 ID。

os.setgid(gid, /)

os.setgid(gid) 是 Python 的 os 模块中的一个函数,用于设置当前进程的组 ID(group ID)。在 Unix 和类 Unix 系统中,每个进程都有一个组 ID,它决定了进程对文件和其他资源的访问权限。

os.setgid(gid) 的参数是:

  • gid: 一个整数,表示要设置的组 ID。

与 os.setegid() 不同,os.setgid() 设置的是实际组 ID(real group ID),而不是有效组 ID。实际组 ID 是进程创建时继承的组 ID,而有效组 ID 用于决定进程的文件访问权限。

请注意,只有超级用户(root)才能成功更改实际组 ID。对于非 root 用户,尝试更改实际组 ID 通常会引发 PermissionError。

下面是一个使用 os.setgid() 的示例:

import os# 获取当前进程的实际组 ID
current_gid = os.getgid()
print(f"Current real group ID: {current_gid}")# 尝试设置新的实际组 ID
# 注意:这里假设您有足够的权限来更改实际组 ID
try:os.setgid(1000)  # 假设 1000 是您想设置的新组 IDprint("Real group ID changed successfully.")
except PermissionError:print("Permission denied. Unable to change real group ID.")# 再次获取并打印实际组 ID,以确认是否更改成功
new_gid = os.getgid()
print(f"New real group ID: {new_gid}")

在上面的代码中,我们首先使用 os.getgid() 获取当前进程的实际组 ID,然后尝试使用 os.setgid() 设置一个新的实际组 ID。和 os.setegid() 一样,由于权限限制,这个操作可能会失败。最后,我们再次使用 os.getgid() 来验证实际组 ID 是否已更改。

在大多数应用程序中,更改进程的实际组 ID 不是必需的。通常,更改有效组 ID(使用 os.setegid())就足够了,因为它决定了进程的文件访问权限。实际组 ID 更多的是在系统编程和创建新进程时用到。

os.setgroups(groups, /)

os.setgroups(groups) 是 Python 的 os 模块中的一个函数,用于设置当前进程的所有组 ID(group IDs)。这个函数允许你更改进程所属的所有组的列表。

os.setgroups(groups) 的参数是:

  • groups: 一个整数列表,表示要设置的所有组 ID。

需要注意的是,只有超级用户(root)才能更改进程的所有组 ID 列表。对于非 root 用户,尝试调用 os.setgroups() 通常会引发 PermissionError。

这个函数将替换当前进程的所有组 ID,而不是添加新的组 ID 到现有的列表中。如果 groups 参数为空列表,则进程将没有任何附加组。

下面是一个使用 os.setgroups() 的示例:

import os# 获取当前进程的所有组 ID
current_groups = os.getgroups()
print(f"Current group IDs: {current_groups}")# 尝试设置新的所有组 ID
# 注意:这里假设您有足够的权限来更改所有组 ID
try:new_groups = [1000, 2000]  # 假设 1000 和 2000 是您想设置的组 IDos.setgroups(new_groups)print("Group IDs changed successfully.")
except PermissionError:print("Permission denied. Unable to change group IDs.")# 再次获取并打印所有组 ID,以确认是否更改成功
new_groups = os.getgroups()
print(f"New group IDs: {new_groups}")

在上面的代码中,我们首先使用 os.getgroups() 获取当前进程的所有组 ID,然后尝试使用 os.setgroups() 设置一个新的组 ID 列表。和前面的函数一样,由于权限限制,这个操作可能会失败。最后,我们再次使用 os.getgroups() 来验证所有组 ID 是否已更改。

在实际应用中,更改进程的所有组 ID 列表通常不是必需的,除非你需要精细控制进程对文件和其他资源的访问权限。在大多数情况下,使用标准文件 I/O 函数和文件权限管理就可以满足需求。

os.setns(fd, nstype=0)

os.setns(fd, nstype=0) 是 Python 3.8 版本中新增的 os 模块函数,用于将当前进程设置到一个新的命名空间(namespace)中。Linux 命名空间是 Linux 内核提供的一种隔离机制,允许系统的一部分视图(如进程、网络、挂载点等)对不同的进程看起来是不同的。这有助于实现容器化技术,如 Docker 和 LXC。

os.setns() 函数的参数是:

  • fd: 一个文件描述符,通常是通过打开 /proc/[pid]/ns/[type] 文件获得的,其中 [pid] 是目标命名空间的进程 ID,[type] 是命名空间类型(如 pid、net、mnt、uts、ipc 或 user)。
  • nstype: 一个可选参数,用于指定命名空间的类型。如果不指定,则从 fd 中推断。

命名空间类型包括:

  • pid: 进程命名空间,隔离进程 ID。
  • net: 网络命名空间,隔离网络设备和地址。
  • mnt: 挂载命名空间,隔离文件系统挂载点。
  • uts: UTS 命名空间,隔离主机名和域名。
  • ipc: IPC 命名空间,隔离进程间通信资源。
  • user: 用户命名空间,隔离用户 ID 和组 ID。

os.setns() 函数将当前进程加入到由 fd 指定的命名空间中,并返回 0 表示成功,否则返回 -1 并设置 errno 以指示错误。

下面是一个使用 os.setns() 的简单示例,该示例将当前进程加入到目标进程的 PID 命名空间中:

import os# 获取目标进程的 PID
target_pid = 1234# 打开目标进程的 PID 命名空间
ns_path = f"/proc/{target_pid}/ns/pid"
with open(ns_path, "r") as ns_file:ns_fd = ns_file.fileno()try:# 将当前进程加入到目标进程的 PID 命名空间中os.setns(ns_fd)print("Successfully set namespace.")except OSError as e:print(f"Failed to set namespace: {e}")# 关闭文件描述符os.close(ns_fd)

请注意,由于 os.setns() 需要超级用户权限来更改命名空间,因此在非特权进程中使用它通常会失败。此外,错误处理在上述示例中是基本的,实际使用中可能需要更详细的错误处理逻辑。

这个函数在编写需要深入操作系统级别的应用程序(如容器管理工具或系统级服务)时非常有用。在普通应用程序开发中,通常不需要使用 os.setns()。

os.setpgrp()

os.setpgrp() 是 Python 的 os.os.setpgid() 的别名,用于设置当前进程的进程组 ID(process group ID)。进程组是一个或多个进程的集合,通常用于信号传递和作业控制。

os.setpgrp() 没有参数,它会将当前进程加入到当前会话(session)的新进程组中,并将当前进程设置为该进程组的领头进程(leader)。如果调用成功,该函数返回 0;如果失败,则引发 OSError。

在 Unix 和类 Unix 系统中,每个进程都有一个进程组 ID,它可以通过 os.getpgrp() 函数获取。进程组通常用于将一组相关的进程组合在一起,以便通过终端(terminal)或其他控制机制进行统一管理。

请注意,只有进程组的领头进程才能调用 os.setpgrp()。非领头进程尝试调用此函数将会失败。

下面是一个使用 os.setpgrp() 的示例:

import os# 获取当前进程的进程组 ID
current_pgrp = os.getpgrp()
print(f"Current process group ID: {current_pgrp}")# 尝试设置新的进程组 ID
try:os.setpgrp()print("Process group ID changed successfully.")
except OSError as e:print(f"Failed to change process group ID: {e}")# 再次获取并打印进程组 ID,以确认是否更改成功
new_pgrp = os.getpgrp()
print(f"New process group ID: {new_pgrp}")

在上面的代码中,我们首先使用 os.getpgrp() 获取当前进程的进程组 ID,然后尝试使用 os.setpgrp() 设置新的进程组 ID。如果调用成功,进程组 ID 应该会发生变化。由于只有领头进程才能更改进程组 ID,因此非领头进程执行此代码可能会失败。

请注意,os.setpgrp() 在 Python 3.4 之后被标记为已弃用,并且在 Python 3.8 中被移除。如果您正在使用较新版本的 Python,您可能需要使用其他方法来设置进程组 ID,例如通过 os.setpgid(os.getpid(), os.getpid())。

os.setpgid(pid, pgrp, /)

os.setpgid(pid, pgrp) 是 Python 的 os 模块中的一个函数,用于将指定的进程 pid 移动到新的进程组 pgrp 中。这个函数主要用于改变现有进程的进程组归属。

参数说明:

  • pid: 要移动的进程的进程 ID。
  • pgrp: 目标进程组的 ID。

调用 os.setpgid() 时,进程 pid 会被移动到进程组 pgrp 中。如果 pid 等于 0,则调用进程本身会移动到进程组 pgrp 中。

需要注意的是,只有具有足够权限的进程(通常是进程组的领头进程或者超级用户)才能成功调用 os.setpgid()。

以下是一个使用 os.setpgid() 的示例:

import os# 获取当前进程的进程 ID
current_pid = os.getpid()# 获取当前进程的进程组 ID
current_pgrp = os.getpgrp()print(f"Current PID: {current_pid}")
print(f"Current PGRP: {current_pgrp}")# 假设我们有一个目标进程 ID 和目标进程组 ID
target_pid = 1234  # 替换为你想移动的进程的 PID
target_pgrp = 5678  # 替换为你想将进程移动到的进程组 PGRPtry:# 尝试将目标进程移动到新的进程组os.setpgid(target_pid, target_pgrp)print(f"Process {target_pid} moved to process group {target_pgrp} successfully.")
except PermissionError:print("Permission denied. Unable to move process to the new process group.")# 再次获取并打印当前进程的进程组 ID,以确认是否更改成功
new_pgrp = os.getpgrp()
print(f"New PGRP after operation: {new_pgrp}")

在上面的代码中,我们首先获取了当前进程的 PID 和 PGRP,然后尝试将目标进程 target_pid 移动到新的进程组 target_pgrp 中。如果操作成功,将打印相应的成功消息;否则,将捕获 PermissionError 并打印错误消息。

需要注意的是,os.setpgid() 在 Python 3.4 之后被标记为已弃用,并且在 Python 3.8 中被移除。如果你正在使用较新版本的 Python,并且需要设置进程组,你可能需要使用 os.setpgrp()(对于当前进程)或 os.killpg(pgrp, signal)(向进程组发送信号)等替代方法。

os.setpriority(which, who, priority)

os.setpriority(which, who, priority) 是 Python 的 os 模块中的一个函数,用于设置进程或线程的调度优先级。这个函数在 Unix-like 系统上有效,但在 Windows 上并不可用。

函数的参数如下:

  • which: 指定要设置优先级的对象类型。这可以是以下常量之一:

    • os.PRIO_PROCESS: 设置进程的优先级。
    • os.PRIO_PGRP: 设置进程组的优先级。
    • os.PRIO_THREAD: 设置线程的优先级(在支持线程优先级的系统上)。
  • who: 指定要设置优先级的进程、进程组或线程的标识符。对于 os.PRIO_PROCESS,who 是进程的 PID;对于 os.PRIO_PGRP,who 是进程组的 PGID;对于 os.PRIO_THREAD,who 是线程的 TID。

  • priority: 指定新的优先级值。具体的取值范围和含义取决于 which 参数和操作系统。

调用 os.setpriority(which, who, priority) 后,操作系统会尝试调整指定对象(进程、进程组或线程)的调度优先级。这通常涉及到内核调度算法中的优先级设置,但实际效果取决于操作系统的实现和当前系统的负载情况。

需要注意的是,只有具有足够权限的进程(通常是超级用户或进程的所有者)才能成功调用 os.setpriority() 来改变其他进程的优先级。此外,不是所有的 Unix-like 系统都支持所有的优先级设置选项。

以下是一个使用 os.setpriority() 的示例,尝试提高当前进程的优先级:

import os# 获取当前进程的 PID
current_pid = os.getpid()# 设置当前进程的优先级
try:# 尝试提高当前进程的优先级# 注意:具体的优先级值取决于操作系统和可用选项os.setpriority(os.PRIO_PROCESS, current_pid, 10)print("Process priority changed successfully.")
except PermissionError:print("Permission denied. Unable to change process priority.")
except ValueError:print("Invalid priority value.")

在上面的代码中,我们尝试提高当前进程的优先级。但是,如果当前进程没有足够的权限,或者提供的优先级值无效,调用将失败并抛出异常。

相关文章:

os模块篇(三)

专栏目录 文章目录 专栏目录os.putenv(key, value, /)os.setegid(egid, /)os.seteuid(euid, /)os.setgid(gid, /)os.setgroups(groups, /)os.setns(fd, nstype0)os.setpgrp()os.setpgid(pid, pgrp, /)os.setpriority(which, who, priority) os.putenv(key, value, /) os.puten…...

kvm虚拟机迁移--来自gpt

离线迁移 离线迁移KVM虚拟机主要涉及将虚拟机完全关闭,然后移动虚拟机的磁盘文件和配置文件到新的宿主机上,并在新宿主机上启动虚拟机。下面是具体的步骤和命令: 步骤 1: 关闭虚拟机 首先,在源宿主机上关闭目标虚拟机。确保虚拟…...

用Typora+picgo+cloudflare+Telegraph-image的免费,无需服务器,无限空间的图床搭建(避坑指南)

用TyporapicgocloudflareTelegraph-image的免费,无需服务器,无限空间的图床搭建(避坑指南) 前提:有github何cloudflare (没有的话注册也很快) 首先,是一个别人写的详细的配置流程,傻瓜式教程&am…...

鸿蒙TypeScript开发入门学习第3天:【TS基础类型】

1、TypeScript 基础类型 TypeScript 包含的数据类型如下表: 注意: TypeScript 和 JavaScript 没有整数类型。 2、Any 类型 任意值是 TypeScript 针对编程时类型不明确的变量使用的一种数据类型,它常用于以下三种情况。 1、变量的值会动态改变时&…...

gitee 本地文件提交到仓库

一、准备工作 1.下载Git Bash Git Bash官网下载地址 http://www.git-scm.com/download/ 点此跳转 2.注册或登录gitee gitee官网地址 https://gitee.com/ 点此跳转 没有账号选择注册有账号的话直接登陆 3.在gitee中新建一个空的仓库 登陆成功后点进个人主页,点击…...

TemperatureTop-kTop-p

一、温度 在语言模型中使用温度(temperature)这个参数是为了控制文本生成过程中的随机性和可预测性。这个概念来自于统计力学中的温度概念,在那里它用来描述系统的熵(或随机性)水平。在语言模型中,输出概率…...

HTTP 协议中常用的两种请求方法:get请求与post请求

一、get请求 (1)什么是 GET 请求? GET 请求是一种向服务器请求获取资源的方式。它通过 URL 将请求参数附加到请求中,并将请求发送给服务器。GET 请求通常用于获取数据,例如读取文章、获取用户信息等操作。 在Node.j…...

飞天使-k8s知识点28-kubernetes散装知识点5-helm安装ingress

文章目录 安装helm添加仓库下载包配置创建命名空间安装 安装helm https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gztar -xf helm-v3.2.3-linux-amd64.tar.gzcd linux-amd64mv helm /usr/local/bin修改/etc/profile 文件,修改里面内容,然后重新启用export PATH$P…...

linux i2c-tools使用总结

1,安装iic-tools sudo apt install i2c-tools -y 2,查看有几条iic总线 [root@sino-platform:/root]# ls /dev/i2c- i2c-0 i2c-1 i2c-2 i2c-3 3,查看i2c命令 [root@sino-platform:/root]# i2c i2cdetect i2cdump i2cget i2cset 4,iic-help命令 [root@sino-platform…...

App推广新篇章:Xinstall助力精准分析与优化

在当前的移动应用市场中,App推广已成为每个开发者不可或缺的一环。然而,推广并非简单的投放广告与等待用户下载,而是需要一套科学、系统的分析与优化流程。这正是Xinstall作为国内专业的App全渠道统计服务商,能够为您带来的核心价…...

vue知识点: v-if和v-for为何不能同时使用?

在vue2和vue3的官方文档里都写到不推荐 v-if和v-for同时使用&#xff0c;如下代码所示&#xff1a; <li v-for"todo in todos" v-if"!todo.isComplete">{{ todo.text }} </li> 一、vue3文档&#xff1a;列表渲染 | Vue.js 在vue3中&#xff…...

2024.3.31力扣(1200-1400)刷题记录

一、1523. 在区间范围内统计奇数数目 1.模拟 class Solution:def countOdds(self, low: int, high: int) -> int:# 模拟return len(range(low,high1,2)) if low & 1 else len(range(low1,high1,2)) 2.数学 总结规律。首为偶数就向下取整&#xff1b;奇数就向上取整。…...

【核弹级软安全事件】XZ Utils库中发现秘密后门,影响主要Linux发行版,软件供应链安全大事件

Red Hat 发布了一份“紧急安全警报”&#xff0c;警告称两款流行的数据压缩库XZ Utils&#xff08;先前称为LZMA Utils&#xff09;的两个版本已被植入恶意代码后门&#xff0c;这些代码旨在允许未授权的远程访问。 此次软件供应链攻击被追踪为CVE-2024-3094&#xff0c;其CVS…...

【Linux在程序运行时打印调用栈信息(函数名,文件行号等)】

在程序运行时打印相关调用栈信息&#xff08;函数名&#xff0c;文件行号等&#xff09;,便于梳理调用逻辑等 //stack.c #include <stdio.h> #include <execinfo.h> #include <stdlib.h> #include <string.h> #include <stdbool.h>#define MAX_…...

9.包和工具【go】

在Go语言中,包是代码的组织单元,而工具链则是Go语言提供的命令行工具,用于构建、测试和调试Go代码。下面我将详细介绍如何导入和使用标准库中的包,如何编写自己的包,以及如何使用Go的工具链。 导入和使用标准库中的包 Go的标准库包含了许多预定义的包,你可以通过导入这…...

判断一个字符串是否是真实手机号:JavaScript

一个简单的正则表达式示例&#xff0c;用于匹配中国大陆的手机号&#xff1a; function isValidPhoneNumber(phoneNumber) {// 定义一个正则表达式&#xff0c;用于匹配中国大陆的手机号const phoneRegex /^1[3-9]\d{9}$/;// 使用正则表达式测试手机号是否匹配return phoneReg…...

3D检测:从pointnet,voxelnet,pointpillar到centerpoint

记录centerpoint学习笔记。目前被引用1275次&#xff0c;非常高。 地址&#xff1a;Center-Based 3D Object Detection and Tracking (thecvf.com) GitHub - tianweiy/CenterPoint CenterPoint&#xff1a;三维点云目标检测算法梳理及最新进展&#xff08;CVPR2021&#xff…...

使用canvas内置api完成图片的缩放平移和导出和添加提示

最近挺忙的&#xff0c;几乎没有时间去更新博客&#xff0c;今天正好在学习新东西&#xff0c;正好和大家分享一下。 最近要做一个使用canvas完成图片平移&#xff0c;缩放&#xff0c;添加标注的需求&#xff0c;完成的效果大概如下&#xff1a; 使用canvas内置api完成图片的缩…...

数据结构——二叉树——堆

前言&#xff1a; 在前面我们已经学习了数据结构的基础操作&#xff1a;顺序表和链表及其相关内容&#xff0c;今天我们来学一点有些难度的知识——数据结构中的二叉树&#xff0c;今天我们先来学习二叉树中堆的知识&#xff0c;这部分内容还是非常有意思的&#xff0c;下面我们…...

算法学习——LeetCode力扣图论篇3(127. 单词接龙、463. 岛屿的周长、684. 冗余连接、685. 冗余连接 II)

算法学习——LeetCode力扣图论篇3 127. 单词接龙 127. 单词接龙 - 力扣&#xff08;LeetCode&#xff09; 描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk&#xff1a; 每一对相…...

状态模式详解:管理对象状态的利器

在软件设计中&#xff0c;我们经常会遇到需要根据对象的不同状态来执行不同行为的情况。为了优雅地管理这些状态及其对应的行为&#xff0c;状态模式&#xff08;State Pattern&#xff09;应运而生。本文将深入探讨状态模式的使用条件、Java代码实现&#xff0c;并结合现实社会…...

探索----------------阿里云

目录 一、阿里云四大件 1、云服务器ECS 2、云数据库RDS 3、负载均衡SLB 4、对象存储OSS 5、其他的云计算产品 1&#xff09;内容分发网络CDN 2&#xff09;专有网络 VPC 二、linux发行版本 三、你平时对系统会怎么优化&#xff08;五大负载&#xff09; 1、cpu 使用率…...

Tidb和MySQL性能简单测试对比

一、单SQL性能对比 由于TiDB的并发能力优秀&#xff0c;但是单个SQL执行延迟较差&#xff0c;为了客观对比&#xff0c;所以只用1个线程来压测tidb和mysql&#xff0c;以观察延迟情况 二、并发SQL性能对比 TiDB:v6.5.2 MySQL:8.0.26 &#xff08;单机&#xff09; 三、结论 …...

2024.2.6力扣每日一题——魔塔游戏

2024.2.6 题目来源我的题解方法一 贪心优先队列 题目来源 力扣每日一题&#xff1b;题序&#xff1a;LCP 30 我的题解 方法一 贪心优先队列 思路&#xff1a;使用贪心的思想&#xff0c;从左到右遍历&#xff0c;若遇到加上当前房间的生命值后小于等于0&#xff0c;由于需要…...

C# OAuth单点登录的实现

原理 单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种身份验证技术&#xff0c;它允许用户使用一组凭据&#xff08;如用户名和密码&#xff09;登录多个相关但独立的系统&#xff0c;而无需在每个系统中都进行登录操作。下面是一个简单的SSO实现示…...

AtCoder Beginner Contest 347 (ABCDEF题)视频讲解

A - Divisible Problem Statement You are given positive integers N N N and K K K, and a sequence of length N N N, A ( A 1 , A 2 , … , A N ) A(A_1,A_2,\ldots,A_N) A(A1​,A2​,…,AN​). Extract all elements of A A A that are multiples of K K K, divi…...

【vue2+antvx6】报错Cannot read properties of undefined (reading ‘toUpperCase‘)

我的代码是这样的 <el-collapseref"collapse"v-model"active"accordionclass"collapseStart"change"collapsechange"><el-collapse-item:name"String(index 1)"v-for"(i, index) in List":key"in…...

主流的开发语言、环境及其特点

主流的开发语言及其特点&#xff1a; 1. Python&#xff1a;以其简洁的语法和强大的库支持而闻名&#xff0c;适用于数据科学、人工智能和网络开发等领域。 2. Java&#xff1a;跨平台的编程语言&#xff0c;广泛应用于企业级应用、Android 开发和大型系统开发。 3. C&#xf…...

Android知识 - 代码混淆ProGuard规则介绍

ProGuard 的规则及示例 规则概述 ProGuard 是一个代码优化工具&#xff0c;它通过移除未使用的代码、重命名类、字段和方法等方式来减小应用的大小。在 ProGuard 的配置文件中&#xff0c;我们可以定义一系列的规则来控制优化和混淆的过程。 规则语法 ProGuard 的规则通常包…...

【Linux的进程篇章 - 冯诺依曼的体系结构】

Linux学习笔记---005 Linux冯诺依曼体系结构理解1、冯诺依曼体系结构1.1、冯诺依曼体系结构1.2、硬件层面1.3、数据层面1.4、那么冯诺依曼体系能干什么呢&#xff1f; 2、操作系统(Operastor System)2.1、概念2.2、操作系统层的核心功能 3、进程的初步理解 Linux冯诺依曼体系结…...

郑州网站推广价格/中国十大seo公司

一天&#xff0c;老板拿了份表格过来&#xff0c;说&#xff1a;把这个数据做个图表出来&#xff0c;更能显示出销量和利润之间的关系&#xff0c;数据如下&#xff1a;绞尽脑汁最后终于做出来了一张图&#xff0c;就像下面这样的。拿给老板看&#xff0c;老板歪着头&#xff0…...

网站制作书籍推荐/百度指数官网登录

建筑给排水工程包括&#xff1a;给水、排水、热水、消火栓、自动喷淋等常用系统&#xff0c;其管道当中流动的是水。(其管道输送介质为水)一、给排水工程的主要功能(1)建筑给水系统的任务&#xff0c;就是经济合理地将水由室外给水管网输送到装置在室内的各种配水龙头、生产用水…...

广告设计与制作工资一般多少/上海高端seo公司

我们知道 Elastic 安全是非常重要的。没有这个我们的数据可以被任何的人进行访问&#xff0c;串改&#xff0c;删除。Elastic Stack 的安全是由 x-pack 所提供的。在 Elastic Stack 7.0 版本之前&#xff0c;这个是商用的版本&#xff0c;需要进行安装&#xff0c;并购买。从El…...

做网站卖东西赚钱吗/上海百度关键词搜索推广服务

删除文件时排除特定文件删除当前目录下所有 *.txt文件&#xff0c;除了test.txtrm ls *.txt|egrep -v test.txt或者rm ls *.txt|awk {if($0 ! "test.txt") print $0}排除多个文件rm ls *.txt|egrep -v (test.txt|fff.txt|ppp.txt)---------------rm -f ls *.log.1|eg…...

长安公司网站建设/竞价推广托管

实际上git使用越来越普及了&#xff0c;当然如果你还是把它当作svn来使用&#xff0c;或者就是只是通过一些图形化工具上几个按钮点一点就失去很多git自身有魅力的地方。首先对照svn或者其他上一代的版本管理工具&#xff0c;我们修改文件不再有“这个文件要不要lock的问题”&a…...

图书类网站开发的背景/东莞关键词排名快速优化

&#xfeff;&#xfeff;Dubbo是Alibaba开源的分布式服务框架&#xff0c;它最大的特点是按照分层的方式来架构&#xff0c;使用这种方式可以使各个层之间解耦合&#xff08;或者最大限度地松耦合&#xff09;。从服务模型的角度来看&#xff0c;Dubbo采用的是一种非常简单的模…...