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

Terraform - 理解 Count 和 For_Each 循环

概述


使用 Terraform 时,您可能需要为同一资源创建多个实例。这时 count 和 for_each 循环就派上用场了。这些循环允许您创建具有相同配置但具有不同值的多个资源。本指南将讲解如何在 Terraform 中使用 count 和 for_each 循环。

Terraform 中的 Count


Terraform 中的 count 参数允许您创建指定数量的相同资源。它是资源块的组成部分,用于定义应创建特定资源的实例数量。

以下是 Terraform 中使用 count 的示例:

resource "azurerm_resource_group" "example" {count    = 3name     = "resourceGroup-${count.index}"location = "East US"tags = {iteration = "Resource Group number ${count.index}"}
}

在上面的示例中,我们使用 count 参数在 Azure 区域“美国东部”中创建了三个名称不同但相同的资源组。

优点:


易于使用:count 参数可直接创建资源的多个实例。
适用于同质资源:当您创建的所有资源除了标识符之外都相同时,count 可能是一个不错的选择。


缺点:


缺乏基于键的标识:count 不提供直接使用唯一键来寻址资源的方法;您必须依赖索引。
不可变:如果您从 count 列表中间删除一个项目,Terraform 会将所有后续资源标记为重新创建,这在某些情况下可能会造成中断。例如:假设您有一个 Terraform 配置,它使用 count 参数管理 Azure 中的一组虚拟机。假设您最初将 count 参数设置为 5,从而预配了 5 个虚拟机:

resource "azurerm_virtual_machine" "vm" {count               = 5name                = "vm-${count.index}"location            = "East US"resource_group_name = azurerm_resource_group.rg.namenetwork_interface_ids = [azurerm_network_interface.nic[count.index].id]# ... (other configuration details)
}

在上面的例子中,假设过了一段时间,您决定不再需要第二个虚拟机(“vm-1”,因为“count.index”从零开始)。要删除此虚拟机,您可以将计数更改为 4,并调整资源名称或索引,这在直观上似乎是正确的方法。

问题就在这里:Terraform 根据资源的索引来决定资源的创建和销毁。如果您只是删除或注释掉“vm-1”的定义,Terraform 将无法识别您确实想要销毁“vm-1”。它会认为从索引 1 开始的所有虚拟机(vm-1、vm-2、vm-3 和 vm-4)都应该被销毁并重新创建,因为它们的索引已更改。

这可能会造成一些破坏性后果:

停机:重新创建虚拟机会导致在其上运行的服务停机,这在生产环境中可能是不可接受的。
数据丢失:如果您未备份虚拟机上的本地数据,则在销毁并重建虚拟机时,这些数据将会丢失。
IP 地址变更:如果虚拟机分配了动态公网 IP,这些 IP 地址可能会发生变化,并可能导致连接问题。
成本:销毁并重建资源可能会产生不必要的成本,例如计算时间的消耗。

为了避免此类count问题,您需要使用 create_before_destroy 生命周期规则,或者考虑 for_each 是否是此类场景的更好选择,因为它提供了一种无需依赖序列即可唯一标识资源的方法。使用 for_each,每个虚拟机将单独管理,您可以移除与不需要的虚拟机对应的单个映射条目,从而只销毁该特定虚拟机,而不会影响其他虚拟机。

Terraform for_each 是什么?


Terraform for_each 是一个元参数,用于创建已定义资源的多个实例。它还使我们能够灵活地根据用于创建实际副本的变量类型,动态设置每个已创建资源实例的属性。

for_each 主要使用字符串集合 (set(string)) 和字符串映射 (map(string))。提供的字符串值用于设置特定于实例的属性。

例如,在创建多个子网时,我们可以为使用同一资源块创建的每个子网指定不同的 CIDR 范围。

当在资源块中使用 for_each 元参数时,会自动提供一个特殊对象 each 来引用由 for_each 创建的每个实例。each 对象用于引用集合中提供的值以及映射类型变量中提供的键值对。

如何在 Terraform 中使用 for each

使用 for_each 元参数的一般语法如下所示。

resource "<resource type>" "<resource name>" {for_each = var.instances// Other attributestags = {Name = each.<value/key>}
}

<resource type> 是 Terraform 资源的类型,例如“aws_vpc”。

<resource name> 是此资源的用户定义名称,用于在 Terraform 配置中的其他位置引用。for_each 属性被赋值为“var.instances”形式的变量值。“var.instances”可以是列表或映射类型。

根据此集合或映射的长度,将创建“<resource type>”类型的资源数量。

最后,each 对象用于为由此创建的每个资源实例分配一个名称标签。如果“var.instances”是集合类型,则“each.value”是唯一可用的属性。如果是映射类型,则可以使用 each.key 和 each.value 同时检索键和值。

在一些高级用例中,也可以将对象映射 (map(object)) 与 for_each 元参数一起使用。我们将在本文的后面部分介绍。

示例 1:使用 for_each 函数处理一组字符串


假设我们需要在 AWS 中创建特定数量的 EC2 实例。

需要创建的实例的具体数量取决于提供的输入。如果输入是“字符串数组”(就 Terraform 而言,即 set(string) ),则 Terraform 的配置如下所示。

variable "instance_set" {type = set(string)default = ["Instance A", "Instance B"]
}resource "aws_instance" "by_set" {for_each = var.instance_setami = "ami-0b08bfc6ff7069aff"instance_type = "t2.micro"tags = {Name = each.value}
}

这里,我们声明了一个 set(string) 类型的输入变量。该变量的默认值是几个字符串。该集合的长度为 2,我们期望“aws_instance”资源块能够创建两个 EC2 实例。

aws_instance 资源块的第一个属性是 for_each,它被赋值为 set(string) 类型的“instance_set”变量值。ami 和 instance_type 属性是硬编码的,因为它们与本博文的主题无关。

此外,Name 标签使用 each 对象来引用 instance_set 变量中包含的每个字符串的值。

执行此 Terraform 配置时,它会创建两个名为“实例 A”和“实例 B”的 EC2 实例。

可以使用下面的 plan 命令输出进行验证。

 + tags                                 = {+ "Name" = "Instance B"}+ tags_all                             = {+ "Name" = "Instance B"}+ tenancy                              = (known after apply)+ user_data                            = (known after apply)+ user_data_base64                     = (known after apply)+ user_data_replace_on_change          = false+ vpc_security_group_ids               = (known after apply)Plan: 2 to add, 0 to change, 0 to destroy.───────────────────────────────────────────────────────────────────────────────────Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

Terraform for_each 函数用于字符串列表


如果使用 list(string) 而不是 set 函数,请使用 Terraform 的内置函数 toset() 进行类型转换。

使用 list(string) 的配置更改很简单,如下所示。

variable "instance_set" {type = list(string)default = ["Instance A", "Instance B"]
}
resource "aws_instance" "by_set" {for_each = toset(var.instance_set)ami = "ami-0b08bfc6ff7069aff"instance_type = "t2.micro"tags = {Name = each.value}
}

示例 2:将 for_each 与 map 结合使用


map 类型提供了一组键值对,为配置更复杂的循环资源提供了更多自定义选项。

在本例中,要创建的实例数量等于 map 对象的长度。但是,除了 each.value 之外,我们还可以利用 each.key 中存储的字符串值。下一步,我们将使用同一个 Terraform 资源块动态设置两个属性,而不是一个。

variable "environments" {type = map(string)default = {prod0415 = "eastus2"dev0415  = "westus"test0415 = "centralus"}
}resource "azurerm_storage_account" "example" {for_each = var.environmentsname                     = "storage${each.key}"resource_group_name      = azurerm_resource_group.example[each.key].namelocation                 = each.valueaccount_tier             = "Standard"account_replication_type = "LRS"
}

上面的environments变量的默认值为三个键值对。

我们在for_each元参数中使用此变量来创建三个资源组,如下面的配置块所示

resource "azurerm_resource_group" "example" {for_each = var.environmentsname     = "${each.key}-resource-group"location = each.valuetags = {Name = each.key}
}

上述代码片段中的 for_each 元参数负责创建三个资源组。

此外,location 指的是在 environments 变量的默认值中设置的值,Name  标签指的是在 environments 变量的默认值中设置的键字符串。

在第二个示例中,我们使用一组字符串创建了具有特定名称的资源组:“prod0415-resource-group”、“dev0415-resource-group”和“test0415-resource-group”。我们使用映射创建了位于不同位置并与相应资源组关联的存储帐户。

 

示例 3:将 for_each 与模块结合使用


Terraform 模块明确公开了一些在使用时需要提供的输入变量。模块帮助我们打包 IaC,以配置一组预定义的基础设施。有时,我们需要多次配置模块中包含的资源。这时,for_each 元参数也与模块结合使用。

在下面的示例中,我们使用 Terraform 注册表中的一个模块在 AWS 中创建安全组。

该模块负责创建安全组和入口规则,这是 Terraform 安全组的基本要求。如果我们需要创建多个具有不同入口 CIDR 块和不同名称的安全组来标识它们,那么我们可以遵循以下方法。

  1. 定义一个 map(string) 类型的变量,其中键值对中的键表示安全组的名称,值表示字符串格式的 CIDR。
  2. 包含模块资源块并初始化它。
  3. 使用 for_each 创建多个安全组,并使用每个对象将 name 和 ingress_cidr_blocks 输入替换为适当的值。请参阅下面的 Terraform 代码。

variable "sg_map" {type = map(string)default = {"SG 1" = "10.10.1.0/24","SG 2" = "10.10.2.0/24"}
}
module "web_server_sg" {for_each = var.sg_mapsource = "terraform-aws-modules/security-group/aws//modules/http-80"name = each.keyvpc_id = aws_vpc.example_vpc.idingress_cidr_blocks = [each.value]
}

运行terraform plan后看到

+ resource "aws_security_group" "this_name_prefix" {+ arn                    = (known after apply)+ description            = "Security Group managed by Terraform"+ egress                 = (known after apply)+ id                     = (known after apply)+ ingress                = (known after apply)+ name                   = (known after apply)+ name_prefix            = "SG 1-"+ owner_id               = (known after apply)+ revoke_rules_on_delete = false+ tags                   = {+ "Name" = "SG 1"}+ tags_all               = {+ "Name" = "SG 1"}+ vpc_id                 = (known after apply)+ timeouts {+ create = "10m"+ delete = "15m"}}
.
.
.
# module.web_server_sg["SG 1"].module.sg.aws_security_group_rule.ingress_rules[0] will be created+ resource "aws_security_group_rule" "ingress_rules" {+ cidr_blocks              = [+ "10.10.1.0/24",]+ description              = "HTTP"+ from_port                = 80+ id                       = (known after apply)+ ipv6_cidr_blocks         = []+ prefix_list_ids          = []+ protocol                 = "tcp"+ security_group_id        = (known after apply)+ self                     = false+ source_security_group_id = (known after apply)+ to_port                  = 80+ type                     = "ingress"}
.
.
.
# module.web_server_sg["SG 2"].module.sg.aws_security_group.this_name_prefix[0] will be created+ resource "aws_security_group" "this_name_prefix" {+ arn                    = (known after apply)+ description            = "Security Group managed by Terraform"+ egress                 = (known after apply)+ id                     = (known after apply)+ ingress                = (known after apply)+ name                   = (known after apply)+ name_prefix            = "SG 2-"+ owner_id               = (known after apply)+ revoke_rules_on_delete = false+ tags                   = {+ "Name" = "SG 2"}+ tags_all               = {+ "Name" = "SG 2"}+ vpc_id                 = (known after apply)+ timeouts {+ create = "10m"+ delete = "15m"}}
.
.
.
# module.web_server_sg["SG 2"].module.sg.aws_security_group_rule.ingress_rules[0] will be created+ resource "aws_security_group_rule" "ingress_rules" {+ cidr_blocks              = [+ "10.10.2.0/24",]+ description              = "HTTP"+ from_port                = 80+ id                       = (known after apply)+ ipv6_cidr_blocks         = []+ prefix_list_ids          = []+ protocol                 = "tcp"+ security_group_id        = (known after apply)+ self                     = false+ source_security_group_id = (known after apply)+ to_port                  = 80+ type                     = "ingress"}
.
.
.
Plan: 9 to add, 0 to change, 0 to destroy.

示例 4:将 for_each 与对象列表结合使用


作为一名 Terraform 开发者,如果打算使用 for_each 创建多个资源实例,那么使用字符串映射 (map(string)) 可能会显得力不从心。尤其是在每个对象需要返回两个以上的值(键和值)且需要调整两个以上属性的情况下。

在这种情况下,可以使用 map(object),其中每个对象可能具有多个属性。但是,为了便于本示例说明,我们将使用 list(object)。

当第三方应用程序的输入不受我们控制时,了解如何使用 for_each 与 list(object) 结合使用非常重要。

请注意,使用 map(object) 比使用 list(object) 更好,因为 map(object) 是使用 for_each 元参数更简洁的方式,因为它更容易检索键和值字符串。

for_each 元参数接受集合或 map(string) 类型。因此,为了使其与 list(object) 配合使用,需要将其与返回字符串值的 for 循环一起使用。for 循环与 for_each 一起使用,返回对象的特定属性,该属性的计算结果为字符串值。

以下代码声明了一个 (list(object)) 类型的变量来创建两个 EC2 实例。

variable "instance_object" {type = list(object({name = stringenabled = boolinstance_type = stringenv = string}))default = [{name = "instance A"enabled = trueinstance_type = "t2.micro"env = "dev"},{name = "instance B"enabled = falseinstance_type = "t2.micro"env = "prod"},]
}

实例对象包含以下属性:

  1. name – 为 EC2 实例分配名称标签
  2. enabled – 一个布尔值,用于决定是否配置 EC2 实例。下一节将详细介绍。
  3. instance_type – AWS 实例类型
  4. env – 为 EC2 实例分配环境标签。

如上所示,根据默认值提供的多个属性,从此对象创建的 EC2 实例数量会有所不同。

以下代码使用 for_each 元参数创建了两个 EC2 实例,其默认值由上述对象的默认值提供。

resource "aws_instance" "by_object" {for_each = { for inst in var.instance_object : inst.name => inst }ami = "ami-0b08bfc6ff7069aff"instance_type = each.value.instance_typetags = {Name = each.keyEnv = each.value.env}
}

这里,我们使用了由“instance_object”变量提供的“instance_type”、“name”和“env”属性,并通过“each.value.<property>”语法设置了 aws_instance 资源的相应属性。

请注意,用于设置 for_each 元参数的 Terraform for 循环会从“instance_object”输入变量中选择 name 属性。由于有两个对象被定义为默认值,因此将创建两个 EC2 实例。

这也会导致 Terraform 将“each”对象的“key”设置为 name 属性。此 each.key 用于设置 Name 标签。此外,使用“each.value.name”也可以达到相同的效果。

这从计划输出中显而易见,如下所示。

 tags                                 = {+ "Name" = "Instance B"}+ tags_all                             = {+ "Name" = "Instance B"}+ tenancy                              = (known after apply)+ user_data                            = (known after apply)+ user_data_base64                     = (known after apply)+ user_data_replace_on_change          = false+ vpc_security_group_ids               = (known after apply)
Plan: 2 to add, 0 to change, 0 to destroy.───────────────────────────────────────────────────────────────────────────────────Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

示例 5:将 for_each 与 Terraform 数据源结合使用


假设我们想要使用与 AWS 中特定类型的多个资源相关的信息,这些资源通过不同的路径(例如不同的 Terraform 代码库)进行配置和管理,在这种情况下,可以使用 for_each。

例如,假设在某个 AWS 区域中配置了多个 EC2 实例,并且我们想要在 Terraform 配置中使用与它们相关的信息。list(string) 类型的变量保存了 EC2 实例 ID 的列表。

variable "instance_ids" {description = "List of EC2 instance IDs"type = list(string)default = ["i-1abcd234", "i-2efgh345", "i-3ijkl456", "i-4mnop567", "i-5qrst678"]
}

 为了访问与这些 EC2 实例相关的信息,我们使用 aws_instance Terraform 数据源,如下所示。这里我们使用 for_each 元参数来读取上面列表中提到的每个实例的值。

data "aws_instance" "ec2_instances" {for_each = toset(var.instance_ids)instance_id = each.value
}

稍后,我们可以使用此 Terraform 数据源基于这些 EC2 实例配置更多资源。

在下面的代码中,我们使用此数据源通过输出变量打印这些实例的多个属性。

output "instance_info" {value = {for instance_id, instance in data.aws_instance.ec2_instances :instance_id => {id = instance.idpublic_ip = instance.public_ipprivate_ip = instance.private_ipinstance_type = instance.instance_type# more attributes as needed}}
}

运行terraform plan

data.aws_instance.ec2_instances["i-02f5e4f2747588bed"]: Reading...
data.aws_instance.ec2_instances["i-061d243847333fec0"]: Reading...
data.aws_instance.ec2_instances["i-02f5e4f2747588bed"]: Read complete after 3s [id=i-02f5e4f2747588bed]
data.aws_instance.ec2_instances["i-061d243847333fec0"]: Read complete after 4s [id=i-061d243847333fec0]Changes to Outputs:+ instance_info = {+ i-02f5e4f2747588bed = {+ id            = "i-02f5e4f2747588bed"+ instance_type = "t2.medium"+ private_ip    = "172.31.6.120"+ public_ip     = ""}+ i-061d243847333fec0 = {+ id            = "i-061d243847333fec0"+ instance_type = "t2.micro"+ private_ip    = "172.31.200.156"+ public_ip     = "13.238.100.100"}

何时使用 Count 还是 For_each


这两种结构都很强大,但它们的适用场景不同。以下是快速参考,可帮助您确定使用哪种结构:

在以下情况下使用 Count:


您需要创建固定数量的相似资源。
资源差异可以用索引表示。


在以下情况下使用 For_each:


您正在处理具有唯一标识符的项目集合。
您的资源并非完全相同,需要单独配置。
您计划在未来进行修改,但这些修改不应影响所有资源。


结论


在 count 和 for_each 之间进行选择很大程度上取决于具体场景。count 参数非常适合简化操作,尤其适用于处理同质资源。而 for_each 则非常适合更受控制的资源声明,它提供灵活性和精确性,这在复杂的基础架构中尤为有益。

相关文章:

Terraform - 理解 Count 和 For_Each 循环

概述 使用 Terraform 时&#xff0c;您可能需要为同一资源创建多个实例。这时 count 和 for_each 循环就派上用场了。这些循环允许您创建具有相同配置但具有不同值的多个资源。本指南将讲解如何在 Terraform 中使用 count 和 for_each 循环。 Terraform 中的 Count Terraform …...

Git本地更新和远端同步操作

1、将远端文件夹拉取到本地 从0—1&#xff1a;克隆 在文件夹空白处点击&#xff1a;Git克隆 输入url&#xff0c;克隆到本地 输入远端文件地址&#xff0c;点击确定&#xff0c;远端文件即可克隆到本地 2、拉取远端更新到本地 文件克隆到本地后&#xff0c;每次更新需…...

激活函数Softmax在不同维度上的应用 | dim参数理解

理解 Softmax 在不同维度上的应用&#xff0c;关键在于明确 Softmax 的作用以及 dim 参数的意义。Softmax 的目标是将输入张量的某些元素转换为概率分布&#xff0c;使得这些元素的和为1。dim 参数决定了沿着哪个维度进行归一化操作。 1. Softmax 的基本原理 Softmax 函数的公…...

地理人工智能中位置编码的综述:方法与应用

以下是对论文 《A Review of Location Encoding for GeoAI: Methods and Applications》 的大纲和摘要整理&#xff1a; A Review of Location Encoding for GeoAI: Methods and Applications 摘要&#xff08;Summary&#xff09; 本文系统综述了地理人工智能&#xff08;G…...

6.DJI-PSDK:psdk订阅无人机高度/速度/GPS/RTK/时间/经纬度等消息及问题解决

DJI-PSDK:psdk订阅无人机高度/速度/GPS/RTK/时间/经纬度等消息 消息订阅可以获取绝大多数无人机的动态信息,包括无人机的姿态、速度、加速度、角速度、高度、GPS 位置、云 台的角度和状态、飞行模式和飞行状态、电机和电池等各类关键信息。 这些信息并不会“一股脑儿地”全部…...

ArrayList的subList的数据仍是集合

ArrayList的subList结果不可强转成ArrayList&#xff0c;否则会抛出 ClassCastException异常 • 级别&#xff1a; 【CRITICAL】 • 规约类型&#xff1a;BUG • 最坏影响&#xff1a; 程序错误&#xff0c;抛出异常 说明&#xff1a;subList 返回的是ArrayList的内部类SubL…...

VS Code怎么换颜色

在 VS Code 中&#xff0c;你可以通过修改主题或自定义编辑器颜色来将界面改为白色。以下是几种方法&#xff1a; 方法 1&#xff1a;切换浅色主题&#xff08;推荐&#xff09; VS Code 自带多个浅色主题&#xff0c;可以直接切换&#xff1a; 按快捷键 Ctrl K&#xff0c;…...

jupyter中切换Anaconda虚拟环境

jupyter中切换虚拟环境 查看python路径 import sys sys.executable这个命令会输出当前 Notebook 使用的 Python 可执行文件的路径 2. 查看安装的包和环境信息&#xff08;前两步都在jupyter notebook中进行&#xff09; !which python !python --version !pip list将你的虚拟…...

红帽认证 Linux安全 级别

红帽认证体系将安全能力划分为‌专项技能认证‌与‌架构师路径‌&#xff0c;覆盖从基础加固到企业级安全架构设计。以下是安全相关认证的级别、核心内容及职业定位&#xff1a; 一、红帽安全认证分级与定位‌ 认证名称级别考试代码核心方向考试难度适用人群‌Red Hat Certif…...

从服务器多线程批量下载文件到本地

1、客户端安装 aria2 下载地址&#xff1a;aria2 解压文件&#xff0c;然后将文件目录添加到系统环境变量Path中&#xff0c;然后打开cmd&#xff0c;输入&#xff1a;aria2c 文件地址&#xff0c;就可以下载文件了 2、服务端配置nginx文件服务器 server {listen 8080…...

WPF 中的元素继承层次结构 ,以下是对图中内容的详细说明:

顶层基类 DispatcherObject&#xff1a;处于继承体系最顶端&#xff0c;是一个抽象类。它为 WPF 元素提供了与 Dispatcher&#xff08;调度器&#xff09;交互的能力&#xff0c;Dispatcher 负责管理线程间的消息传递&#xff0c;确保 UI 操作在正确的线程&#xff08;通常是 …...

ROS IkFast运动学插件

ikFast运动学插件生成 环境安装ROS依赖安装openrave依赖下载依赖代码工具使用urdf转dae设置精度查看模型关节生成代码生成插件 环境 ubuntu 20.04ROS版本&#xff1a;noetic 安装ROS依赖 sudo apt-get install -y ros-noetic-desktop ros-noetic-collada-urdf ros-noetic-mov…...

Flink Hive Catalog最佳实践

Flink Hive Catalog 最佳实践 一、配置与初始化 依赖管理 Hive Connector 版本对齐&#xff1a;需确保 flink-sql-connector-hive 版本与 Hive 版本严格匹配&#xff08;如 Hive 3.1.3 对应 flink-sql-connector-hive-3.1.3_2.12&#xff09;&#xff0c;同时添加 Hadoop 遮蔽…...

接口测试之postman使用指南

一、为何使用postman postman是一款简单高效的接口测试工具&#xff0c;能够很方便发送接口请求&#xff0c;易于保存接口请求脚本&#xff0c;postman提供接口响应数据比对功能&#xff0c;可以设置预期结果作断言&#xff0c;还能把测试用例放在一个集合中批量执行&#xff…...

小豆包api:支持GPT-4.1全新系列模型api,纯官逆向可用!

今天凌晨&#xff0c;OpenAI正式发布GPT-4.1系列模型&#xff0c;带来标准版GPT-4.1&#xff0c;更轻量快速GPT-4.1 mini和极致性价比的GPT-4.1 nano三款模型&#xff0c;全面超越GPT-4o&#xff0c;更聪明、更便宜。 小豆包api已全面支持GPT-4.1全新系列模型&#xff01; 与前…...

GPTNet如何革新创意与效率

引言 人工智能正在以前所未有的速度改变我们的工作与生活方式&#xff0c;从智能写作到视觉创作&#xff0c;AI工具已成为不可或缺的伙伴。在众多平台中&#xff0c;GPTNet以其强大的功能整合和直观体验崭露头角。它不仅汇集了GPT系列、Claude、Grok、Gemini等顶级对话模型&am…...

3.3.6 VO-O语法- 流程算子

流程算子是VO语言最重要的一类语法算子。它们是VO语言特有的语法概念。这些算子属于容器算子&#xff0c;用于组织管理各类流程。这样的设计有利于流程的复用。可以将流程视为一个大级别的函数模块&#xff0c;在更大的业务逻辑中复用&#xff0c;从而降低业务开发的复杂度&…...

c++引入nacos,详细步骤

以下是将Nacos引入C项目的详细步骤&#xff0c;包括安装、配置和代码实现&#xff1a; 1. 安装Nacos服务器 下载Nacos服务器安装包&#xff0c;可以从Nacos官网获取最新版本。 解压安装包并启动Nacos服务器&#xff1a; cd nacos/bin sh startup.sh -m standalone 这将启动…...

OpenAI 最新发布的 GPT-4.1 系列在 API 中正式上线

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

亚远景-自动驾驶时代,ASPICE评估标准将如何演进?

自动驾驶时代&#xff0c;ASPICE评估标准将从以下几个方面演进&#xff1a; 1. 技术领域的扩展 增加硬件工程和机器学习过程组 &#xff1a;ASPICE 4.0版本新增了硬件工程和机器学习过程组&#xff0c;以应对自动驾驶系统中硬件与软件深度融合的需求。自动驾驶功能的实现不仅依…...

Redis 数据类型全解析:从基础到实战应用

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Redis 作为高性能的键值对存储系统&#xff0c;其丰富的数据类型是实现复杂业务逻辑的核心优势。本文将深入解析 Redis 六大核心数据类型及扩展类型&#xff…...

基于JSP+MySQL实现用户注册登录及短信发送功能

用户注册信息存入数据库 内容介绍 此项目是前台用户的登录和注册&#xff0c;,这部分包括两个子部分:其中一个为新用户注册&#xff0c;在这里我们可以通过注册浏览更多信息;另一个是用户登录&#xff0c;用户登录系统是一.般 Web 网站都有的子系统,其作用是限制该网站某些资…...

Spark-SQL核心编程2

路径问题 相对路径与绝对路径&#xff1a;建议使用绝对路径&#xff0c;避免复制粘贴导致的错误&#xff0c;必要时将斜杠改为双反斜杠。 数据处理与展示 SQL 风格语法&#xff1a;创建临时视图并使用 SQL 风格语法查询数据。 DSL 风格语法&#xff1a;使用 DSL 风格语法查询…...

Flink SQL SavePoint最佳实践

以下是 Flink SQL Savepoint 最佳实践&#xff0c;涵盖配置、触发、恢复及注意事项&#xff0c;高效管理作业状态&#xff1a; 一、Savepoint 的配置与触发 1. 基础配置 存储路径&#xff1a;在 flink-conf.yaml 中全局设置 Savepoint 存储目录&#xff0c;避免每次手动指定路…...

【无标题】Spark-SQL编程(2)

以下是今天学习的知识点以及代码测试&#xff1a; Spark-SQL核心编程&#xff08;四&#xff09; 实验内容&#xff1a; 利用IDEA开发Spark-SQL。 实验步骤&#xff1a; 利用IDEA开发Spark-SQL 创建子模块Spark-SQL&#xff0c;并添加依赖 <dependency> <grou…...

django项目之添加资产信息功能

资产信息功能添加 目录 1.创建表格 2.页面展示 3.新增和修改 4.删除 这篇文章的内容, 就是在前面做的基础上, 新增一个资产管理功能, 其实就和之前的部门信息还有员工信息差不多的, 但是这篇文章里面, 会有些细节的地方, 和之前的不太一样。那下面我们就开始讲述这篇文章…...

macos下 ~/.zshrc~ 和 ~/.zshrc

macos下 ~/.zshrc~ 和 ~/.zshrc ~/.zshrc通常是备份文件或临时文件&#xff0c;可能由编辑器&#xff08;如vim&#xff09;创建&#xff0c;通常可以安全删除&#xff0c;不会影响系统运行。 在Mac下&#xff0c;这种带~后缀的备份文件通常是由以下情况产生&#xff1a; 常…...

Kotlin集合操作陷阱与突围:如何优雅地边遍历边修改MutableList

在Kotlin开发中&#xff0c;MutableList是我们常用的集合类型之一。但当我们需要在遍历列表的同时修改它&#xff08;添加或删除元素&#xff09;时&#xff0c;很多开发者会遇到ConcurrentModificationException异常。本文将详细介绍如何安全高效地实现这一需求。 一、问题场…...

交换机与路由器的默契配合:它们的联系与区别

交换机与路由器的默契配合&#xff1a;它们的联系与区别 一. 交换机与路由器的基本功能1.1 交换机的功能1.2 路由器的功能 二. 交换机和路由器的区别三. 交换机和路由器的联系3.1 数据转发的协作3.2 网络分段与分隔3.3 协同工作提供互联网接入 四. 交换机和路由器的联合应用场景…...

cocos 3D自由世界游戏 - 开发

cocos 3D自由世界游戏 - 开发 序概述第一步 创建环境,XForge 框架基础3D创建思路场景地形树木等环境人物角色角色实现实现代码篇空间管理篇动画逻辑篇按钮实现篇虚拟摇杆多功能按钮移动和目标篇AI实现角色属性以及身份牌篇装备篇结尾序 在同时浅入了unity 和 cocos以来,得到…...

SOME/IP中”客户端消费“及”服务端提供”的解析

先上结论 AREthAddConsumedEventGroup-->客户端的函数-->谁调用 Consumed函数&#xff0c;谁就是消费者 AREthAddProvidedEventGroup-->服务端的函数-->谁调用 Provided函数&#xff0c;谁就是服务端 Server 端&#xff1a;AREthAddProvidedEventGroup → 声明 &…...

视频分析设备平台EasyCVR安防视频管理系统,打造电石生产智能视频监控新体系

一、背景介绍 电石生产中的出炉工序是整个生产流程中最为繁重且危险的环节。在开堵炉眼的过程中&#xff0c;电石极易发生飞溅现象&#xff0c;尤其在进行吹氧操作时&#xff0c;人员灼伤的风险极高。鉴于此&#xff0c;该工序正逐步由传统的人工操作模式向智能化方向转变。然…...

ffmpeg实现视频流抽帧

ffmpeg 实现视频流抽帧 抽取实时视频帧 如果你的实时视频是通过 RTSP、UDP 或其他协议获取的&#xff0c;可以直接调用 FFmpeg 命令来抽取帧。 ffmpeg 命令 示例 1 ffmpeg -i rtsp://your_rtsp_stream_url -vf fps1 -update 1 output.jpg说明&#xff1a; -i rtsp://your…...

VTK知识学习(51)- 交互与Widget(三)

1、概述 从前面的 内容可知&#xff0c;交互器样式(如 vtknteractorStylelmage)主要是根据不同的键盘、鼠标等消息来控制相机(vtkCamera)、Actor 等相关参数&#xff0c;从而达到交互的目的。而在渲染场景中&#xff0c;这些交互器样式是没有表达实体的。也就是说&#xff0c;在…...

蓝桥杯嵌入式开发板结构分析及功能学习笔记

目录 板子结构一览时钟源分析74LS573锁存器按键输入滴答定时器 SysTick串口收发LCD屏幕ADC采样AT24C02(EEPROM)可编程电阻TIM定时器输入捕获DAC 板子结构一览 主控为 **STM32G431RBT6**** 外部晶振频率为 **24MHz IAP下载为** GD32F350C8T6** 时钟源分析 自己配置的STM32Cu…...

C++进阶——C++11_智能指针

目录 1、问题引入 2、RAII和智能指针 3、C标准库的智能指针 3.1 auto_ptr (不好) 3.2 unique_ptr 3.3 shared_ptr (重点) 3.4 weak_ptr (重点) 4、shared_ptr的循环引用问题(重点) 5、shared_ptr的线程安全问题 6、C11智能指针和boost的关系 7、内存泄漏 7.1 什么是…...

音频格式转换

1. 下载ffmpeg https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-7.1.1-full_build.7z 2. 配置ffmpeg环境变量 3.安装pydub pip install pydub 4.编写转化工具代码 from pydub import AudioSegment def convertM4aToWav(m4a,wav):sound AudioSegment.from_file(m4a, f…...

mysql安装配置教程

由于您可能需要针对特定操作系统&#xff08;如Windows、macOS或Linux&#xff09;的MySQL安装配置教程&#xff0c;这里我将提供一个较为通用的指南&#xff0c;适用于大多数情况。如果您有特定的操作系统需求&#xff0c;请告诉我&#xff0c;我可以提供更详细的指导。 ### …...

埃文科技助力山西公共数据运营新发展

近日&#xff0c;郑州埃文科技有限公司&#xff08;以下简称“埃文科技”&#xff09;凭借“数据场景生态”的三维核心竞争力&#xff0c;成为山西云时代政务云技术有限公司专业领域数据类产品授权运营合作伙伴。 埃文科技作为数据全生命周期价值建设先行者&#xff0c;深度赋…...

【STM32】在FreeRTOS下使用硬件SPI收发数据出现的时序耦合问题(WK2124芯片为例)

问题 STM32中在Freertos使用SPI通讯芯片 WK2124进行SPI转4串口时&#xff0c;接收数据为一个任务&#xff0c;发送数据为一个任务&#xff0c;切接受任务优先级更高实测发现收发一段时间&#xff08;约几分钟&#xff09;外扩芯片会死锁导致WK2124复位。 分析 首先&#xff…...

linux Shell编程之函数与数组(四)

目录 一. shell 函数 1. 函数的用法 (1) 两个数求和 (2) 系统资源监控并报警函数 2. 函数变量的作用范围 3. 函数的参数 4. 递归函数 二. shell 数组 (1) 获取数组长度 (2) 读取某下标赋值 (3) 数组遍历 (4) 数组切片 (5) 数组替换 (6) 数组删除 三. shell 脚本…...

4.vtk光照vtkLight

文章目录 VTK中的光照1. vtkLight 的两种类型&#xff1a;位置光照和方向光照2. vtkLight 的常用方法3. 方法命名风格4. vtkProp 的可见性与 vtkLight 的开关 示例 VTK中的光照 vtkLight: 用于定义一个或多个光源。每个光源可以有其颜色、位置、焦点等属性。 vtkActor: 每个vtk…...

定义AIDL 接口

目录 定义 AIDL 接口创建 .aidl 文件实现 AIDL 接口向客户端公开接口接口的版本兼容性小结1. 定义 AIDL 接口 AIDL 接口是什么? 概念 AIDL(Android 接口定义语言)用来定义跨进程通信(IPC)的接口。简单来说,它规定了客户端和服务端之间如何进行数据交换和方法调用。.aidl…...

Linux系统-scp命令--两台服务器之间传输文件

一、定义 scp是secure copy的简写&#xff0c;scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令&#xff0c;可以在linux服务器之间复制文件和目录&#xff0c;scp传输是加密的&#xff0c;可能会稍微影响一下速度。另外&#xff0c;scp还非常不占资源&#xff0c;不会提…...

Visual Studio + OpenCV C++ 安装与配置教程

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,广泛用于图像处理、视频分析、模式识别和机器学习等领域。它由Intel公司于1999年发起,并在2000年由Willow Garage(一个机器人研究机构)进一步开发和维护。OpenCV支持多种编程语言,包括C++、Python…...

怎么通过OPPO手机进行图片编辑?图片编辑攻略,打造专业级照片

在当今数字化时代&#xff0c;手机摄影已成为记录生活、分享瞬间的重要方式。而作为市场上广受欢迎的智能手机品牌之一&#xff0c;OPPO手机不仅在摄影硬件上表现出色&#xff0c;其内置的图片编辑功能也极为强大&#xff0c;能够满足使用者从基础调整到高级创作的各种需求。本…...

基于MFC 的链接库

1. 动态库 MFC Regular dll: ① DLL内部有一个CWinApp类全局对象(像是基于mfc的exe程序那样存在一个theApp)&#xff0c;该CWinApp类的Initstance负责执行dll内部初始化。 ② DLL不能人为提供Dllmain函数&#xff0c;该函数由mfc库提供。 ③在visual studio 的工程配置中&a…...

2025.04.15【Connection】| 生信数据可视化:连接图绘制指南

文章目录 生信数据可视化&#xff1a;连接图绘制指南什么是连接地图&#xff1f;为什么使用连接地图&#xff1f;如何在R中创建连接地图&#xff1f;1. 安装和加载必要的库2. 准备数据3. 计算大圆航线的距离和方位角4. 创建连接地图 高级技巧1. 自定义地图样式2. 添加地理背景 …...

回溯算法:List 还是 ArrayList?一个深拷贝引发的思考

在学习和使用回溯算法解决问题时&#xff0c;我们经常会遇到需要维护一个结果列表&#xff0c;例如所有可能的子集、组合或排列。 这个结果列表通常是一个 List<List<Integer>>&#xff0c;其中内部的 List<Integer> 代表一个具体的解。 然而&#xff0c;在…...

WPS表格中设置折线图随数据列自动变化——存钱计划

效果展示&#xff1a; wps自动更新表格 1.公式>名称管理器>新建 2.修改名称和引用位置 OFFSET(Sheet1!$A$2,0,0,COUNTA(Sheet1!$A:$A)-1,1) 3.插入>图表 4.右键>选择数据 5.添加&#xff0c;输入名称和系列值。 Sheet1!名称管理器里的名字 标签分类里也填入 6如图…...