【ansible】实施任务控制
目录
实施任务控制
一,循环(迭代)--- loop
1,利用loop----item循环迭代任务
2,item---loop循环案例
1,定义item循环列表
2,通过变量应用列表格式
3,字典列表(迭代嵌套子变量)
4,register变量与loop
二,when条件任务语法
1, when条件测试案例
2,when条件表达语法
3, 多条件表达and or语法
4,组合循环和有条件判断任务
三,实施处理程序
1,Handlers和notify触发条件
四,处理任务失败
1,ignore_errors 忽略错误继续任务
2, force_handlers: yes
3, failed_when
4, change_when 满足条件输出change状态
5,block、rescue、always块和错误处理
实施任务控制
一,循环(迭代)--- loop
1,利用loop----item循环迭代任务
通过循环管理员不需要编写多个使用同一模块的任务。例:他们不需要编写五个任务来确保存在五个用户,而是只需要编写一个任务来对含有五个用户的列表迭代,从而确保他们都在。
ansible支持loop关键字对一组项目迭代任务,可以配置循环以利用各个项目、列表中各个文件的内容、生成数字序列化或更为复杂的结构来重复任务。
2,item---loop循环案例
loop关键字添加到任务中,将应对其迭代任务的项目列表取为值。 循环item保存每个迭代过程中使用的值。
确定多个服务运行
1,定义item循环列表
(1)查看node1主机上的httpd与named服务是否启动,发现没启动
[root@node1 ~]# systemctl status httpd
[root@node1 ~]# systemctl status named
(2)查看node2主机上的httpd与named服务是否启动,发现没启动
[root@node2 ~]# systemctl status httpd
[root@node2 ~]# systemctl status named
(3)编辑playbook4.yml文件
---
- name: play1
hosts: test
tasks:
- name: task1
service:
name: "{{ item }}"
state: started
loop:
- httpd //定义item循环列表
- named bind的服务名位named
(4)执行脚本文件playbook4.yml,使其启动httpd服务与bind服务
[root@server var_test]# ansible-playbook playbook4.yml
(5)查看node1主机上的httpd与named服务是否启动,发现此时已经启动
[root@node1 ~]# systemctl status httpd
[root@node1 ~]# systemctl status named
(6)查看node2主机上的httpd与named服务是否启动,发现此时已经启动
[root@node2 ~]# systemctl status httpd
[root@node2 ~]# systemctl status named
2,通过变量应用列表格式
(1)此时node1上的httpd与named服务是关闭的
[root@node1 ~]# systemctl status httpd
[root@node1 ~]# systemctl status named
(2)此时node2上的httpd与named服务是关闭的
[root@node2 ~]# systemctl status httpd
[root@node2 ~]# systemctl status named
(3)编辑playbook4.yml文件
---
- name: play1
hosts: test
vars:
pkname:
- httpd
- named
tasks:
- name: task1
service:
name: "{{ item }}"
state: started
loop: "{{ pkname }}" //通过变量应用列表格式
(4)执行playbook4.yml剧本文件
[root@server var_test]# ansible-playbook playbook4.yml
(5)查看node1主机上的httpd与named服务是否启动,发现此时已经启动
[root@node1 ~]# systemctl status httpd
[root@node1 ~]# systemctl status named
(6)查看node2主机上的httpd与named服务是否启动,发现此时已经启动
[root@node2 ~]# systemctl status httpd
[root@node2 ~]# systemctl status named
3,字典列表(迭代嵌套子变量)
(1)编辑剧本playbook4.yml
---
- name: play1
hosts: test
tasks:
- name: task1
user:
name: "{{ item.name }}"
state: present
groups: "{{ item.groups }}"
loop:
- { name: 'jane',groups: 'wheel'}
- { name: 'joe', groups: 'root' }
(2)执行剧本playbook4.yml
[root@server var_test]# ansible-playbook playbook4.yml
(3)在node1上可以查看到playbook4中创建的用户以及附加组
[root@node1 ~]# id jane
[root@node1 ~]# id joe
(4)在node2上可以查看到playbook4中创建的用户以及附加组
[root@node2 ~]# id jane
[root@node2 ~]# id joe
4,register变量与loop
(1)编写剧本文件playbook4.yml
- name: play1
gather_facts: no
hosts: localhost
tasks:
- name: task1
shell: "echo this is my item: {{ item }}"
loop:
- one
- two
register: echo_results //变量注册
- name: task2
debug:
var: echo_results //变量内容显示在屏幕上
(2)执行剧本文件
[root@server var_test]# ansible-playbook playbook4.yml
二,when条件任务语法
when语句用于有条件运行任务。它取要测试的条件为值。如果条件满足,则运行任务。如果条件不满足则跳过任务。
1, when条件测试案例
案例一:可以测试当run_my_task 为true的时候执行否则不执行
(1)此时的node1主机上没有安装bind
[root@node1 ~]# rpm -q bind
(2)编辑playbool4.yml文件,使得当my_task为true,在node1安装bind
---
- name: play1
hosts: node1
vars:
my_test: true
tasks:
- name: task1
yum:
name: bind
when: my_test
(3)执行剧本playbool4.yml
[root@server var_test]# ansible-playbook playbook4.yml
(4)此时在node1主机上查看bind,发现已经被安装
[root@node1 ~]# rpm -q bind
案例2: 判断my_service是否有值,若有值则用作安装的软件包名称,若没有定义变量则跳过任务不显示错误
(1)此时的node1主机上没有vsftpd包
[root@node1 ~]# rpm -q vsftpd
(2)编辑playbook4.yml文件,在node1上安装vsftpd包
---
- name: play1
hosts: node1
vars:
my_package: vsftpd
tasks:
- name: task1
yum:
name: "{{ my_package }}"
when: my_package is defined
(3)执行剧本playbook4.yml
[root@server var_test]# ansible-playbook playbook4.yml
(4)此时在node1主机上查看vsftpd,发现已经被安装
[root@node1 ~]# rpm -q vsftpd
2,when条件表达语法
操作 | 示例 |
等于(值为字符串) | ansible_machine == "x86_64" |
等于(值为数字) | max_memory == 512 |
小于(小于等于) | Min_memory <128 min_memory <= 512 |
大于 (大于等于) | Min_memory > 256 max_memory >= 512 |
不等于 | Min_memory != 512 |
变量存在 | Min_memory is defined |
变量不存在 | Min_memory is not defined |
布尔值变量是true. 1、True 或yes 的求值为true 变量Memory_available值存在为true则执行 | Memory_available |
布尔值变量是false. 0、 False 或no的求值为false 变量Memory_available值存在为true则执行 | Not memory_available |
第一个变量的值存在,在第二个变量的列表中条件满足 (事实变量在变量列表中满足要求) | Ansible_distribution in supported_distros |
- name: Demonstrate the inkeyword
hosts: all
gather_facts: yes
Vars:
supperted_distros:
- Redhat
- Fedora
Tasks:
- name: Install httpd using yum, where supported
yum:
name: http
state: present
when: ansible_distribution in supperted_distros
注
When 语句的缩进,由于when语句不是模块变量,他必须通过缩进到任务的最高级别,放置在模块的外面。
任务是YAML散列/字典,when语句只是任务重的又一个键,就如任务的名称以及它所使用的模块一样。通常的惯例是将可能存在的任何when关键字放在任务名称和模块的后面。
3, 多条件表达and or语法
语法一:
when:ansible_distribution == "Redhat" or ansible_distribution == "Fedora"
When: ansible_distribution_version == "7.5" and ansible_kernel == "3.10.0-327.el7.x86_64"
语法二:
使用and语句时,则必须要所有条件为真时,才执行相应任务
when:
- ansible_distribution_version == "7.5"
- ansible_kernel == "3.10.0-327.el7.x86_64"
使用括号分组条件,可以更好的表达复制的条件语句
When: >
( ansible_distribution_version == "redhat" and
ansible_distribution_major_version == "7" )
or
( ansible_distribution_version == "fedora" and
ansible_distribution_major_version == "28" )
4,组合循环和有条件判断任务
对某类任务结合使用when和loop时,将对每项检查when语句
yum安装软件包,只要/上挂载的文件系统有超过300M的可用空间。 Ansible_mounts 事实是一组字典,各自代表一个已挂在文件系统的相关事实。循环迭代每个字典,只要找到了代表两个条件都为真的已挂载文件系统的字典时,条件语句才得到满足。
- name: install mariadb-server if enough space on root
yum:
name: mariadb-server
state: latest
loop: "{ ansible_mounts }" //字典循环
when: item.mount == "/" and item.size_available > 300000000 //当两个条件都满足则执行安装
三,实施处理程序
1,Handlers和notify触发条件
- notify (通知)此action可用于每个play最后被触发这样避免多次发生改变时都执行指定操作,仅在所有变化发生完成后一次性的执行操作。在notify中列出的操作作为handler及notify中调用handlers中定义的操作。(notify判断是否有发生改变一旦发生改变触发handlers执行指定操作)
- handlers (操作者)是task列表这些task和前述的task没有本质区别,用于当关注资源发生变化时才会采取一定的操作。
案例:实现只有修改了配置文件才会重启服务
(1)将/etc/httpd/conf/httpd.conf 复制到/目录下
[root@server var_test]# cp /etc/httpd/conf/httpd.conf /
(2)编辑文件/httpd.conf,将端口改为10000
#Listen 80
Listen 10000
(3)在受控主机node1与node2上关闭防火墙,并设置selinux为permissive
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# setenforce 0
[root@node2 ~]# systemctl stop firewalld
[root@node2 ~]# setenforce 0
(4)创建playbook5.yml文件
- name: handlers test
hosts: all
tasks:
- name: install httpd service
yum:
name: httpd
state: installed
- name: copy config file
copy:
src: /httpd.conf
dest: /etc/httpd/conf/httpd.conf
notify:
- restart service
- name: start httpd service
service:
name: httpd
state: started
handlers:
- name: restart service
service:
name: httpd
state: restarted
(5)执行剧本playbook5.yml
因为控制端的端口号为10000,发生了修改,所以会重启服务
[root@server var_test]# ansible-playbook playbook5.yml
(6)再次执行剧本文件playbook5.yml,此时的配置文件并未发生任何改变,所以服务并未重新启动
[root@server var_test]# ansible-playbook playbook5.yml
(7)此时再将配置文件的端口号由10000改为80
Listen 80
(8)再次执行剧本playbook5.yml,发现又会重启服务,因为/etc/httpd文件发生改变
[root@server var_test]# ansible-playbook playbook5.yml
注意:handlers写在notify模块之后
2, tags标签定义
tags标签: 通过此标签来指定playbook文件执行哪条命令
执行 :-t 标签名
案例:仅执行playbook5.yml中的安装httpd命令
(1)编辑playbook5.yml文件
- name: handlers test
hosts: all
tasks:
- name: install httpd service
yum:
name: httpd
state: installed
tags: yum_httpd
- name: copy config file
copy:
src: /httpd.conf
dest: /etc/httpd/conf/httpd.conf
notify:
- restart service
- name: start httpd service
service:
name: httpd
state: started
handlers:
- name: restart service
service:
name: httpd
state: restarted
(2)此时执行剧本文件playbook.yml会发现只执行了装包命令
[root@server var_test]# ansible-playbook -t yum_httpd playbook5.yml
四,处理任务失败
1,ignore_errors 忽略错误继续任务
默认情况下任务失败时play会终止。可以通过ingnore乎略失败,其他任务可以继续执行。
案例:
(1)编辑剧本文件playbook6.yml
- name: restart httpd is postfix is running
hosts: all
tasks:
- name: get postfix server status
command: /usr/bin/systemctl is-active postfix
# ignore_errors: yes
register: result
- name: restart apache httpd based on postfix status
service:
name: httpd
state: restarted
when: result.rc == 0
(2)此时受控端主机并未安装postfix,所以任务执行会失败
[root@server var_test]# ansible-playbook playbook6.yml
(3)编辑剧本文件playbook6.yml
- name: restart httpd is postfix is running
hosts: all
tasks:
- name: get postfix server status
command: /usr/bin/systemctl is-active postfix
ignore_errors: yes
register: result
- name: restart apache httpd based on postfix status
service:
name: httpd
state: restarted
when: result.rc == 3
(4)此时受控端主机虽然并未安装postfix,但是会跳过失败,继续执行下面的任务
[root@server var_test]# ansible-playbook playbook6.yml
2, force_handlers: yes
如果任务失败并且play在该主机上终止,则收到play中早前任务通知的处理程序将不会运行。
(1)此时的/etc/http配置文件并未做任何改变,所以服务httpd不会自启
[root@server var_test]# ansible-playbook playbook5.yml
(2)将/etc/httpd配置文件进行修改,notify触发成功,但是后面的服务名错误,force_handlers: yes 关键字还是会执行handlers中的命令
Listen 1004
(3)编辑playbook5.yml文件
- name: handlers test
force_handlers: yes
hosts: all
tasks:
- name: install httpd service
yum:
name: httpd
state: installed
- name: copy config file
copy:
src: /httpd.conf
dest: /etc/httpd/conf/httpd.conf
notify:
- restart service
- name: start httpd service
service:
name: http
state: started
handlers:
- name: restart service
service:
name: httpd
state: restarted
(4)此时执行剧本文件playbook5.yml;即使后面的服务名写错了,也能执行handlers
[root@server var_test]# ansible-playbook playbook5.yml
3, failed_when
failed_when其实是ansible的一种错误处理机制,是由fail模块使用了when条件语句的组合效果。
我们也可以直接通过fail模块和when条件语句,写成如下:
- name: run user
shell: /usr/local/bin/create_users.sh
register: result
ignore_errors: yes
- name: fail the play if the previous command did not succeed
fail:
msg: "please create user"
when: "'not' in result.stdout"
4, change_when 满足条件输出change状态
当我们控制一些远程主机执行某些任务时,当任务在远程主机上成功执行,状态发生更改时,会返回changed状态响应,状态未发生更改时,会返回OK状态响应,当任务被跳过时,会返回skipped状态响应。我们可以通过changed_when来手动更改changed响应状态。
(1)Playbook5.yml案例中,如果配置文件/httpd.conf并未发生改变,执行显示ok
[root@server var_test]# ansible-playbook playbook5.yml
(2)编辑playbook5.yml文件
- name: handlers test
hosts: all
tasks:
- name: install httpd service
yum:
name: httpd
state: installed
- name: copy config file
copy:
src: /httpd.conf
dest: /etc/httpd/conf/httpd.conf
register: cmd_v1
changed_when: not cmd_v1.changed
notify:
- restart service
- name: start httpd service
service:
name: httpd
state: started
handlers:
- name: restart service
service:
name: httpd
state: restarted
(3)修改后,此时来执行剧本文件playbook5.yml,已经由ok状态变为changed状态
[root@server var_test]# ansible-playbook playbook5.yml
5,block、rescue、always块和错误处理
通过块,也可结合rescue和always语句来处理错误,如果块中的任何任务失败,则执行其rescue块中的任务来进行恢复。在block子句中的任务以及rescue子句中的任务(如果出现故障)运行之后,always子句中的任务运行。
总结:
- block: 定义要运行的主要的任务。
- rescue: 定义要在block子句中定义的任务失败时运行的任务。
- always:定义始终都独立运行的任务,不论block和rescue子句中定义的任务是否成功还是失败。
block有错才会执行rescue;always怎么都会执行
案例: 在playbook中实施块即使block子句中定义的任务失败,rescue和always子句中定义的任务也会执行。
创建目录文件和文本文件;注意如果默认路径下存在同名文件需要进一步处理才能创建该文件。
(1)编辑playbook7.yml文件
---
- name:
hosts: localhost
tasks:
- name: block module
block:
- name: create directory
file:
name: /aaa
state: directory
rescue:
- name: backup filenmae
shell: mv /aaa /aaa.backup
- name: create directory force
file:
name: /aaa
state: directory
force: yes
always:
- name: create file
file:
name: /newfile
state: touch
(2)执行剧本playbook7.yml文件
[root@server var_test]# ansible-playbook playbook7.yml
(3)目录/aaa与文件/newfile已经被创建
[root@server var_test]# ls -l /aaa
[root@server var_test]# ls -l /newfile
[root@server var_test]# cd /aaa
相关文章:

【ansible】实施任务控制
目录 实施任务控制 一,循环(迭代)--- loop 1,利用loop----item循环迭代任务 2,item---loop循环案例 1,定义item循环列表 2,通过变量应用列表格式 3,字典列表(迭代嵌套子…...

49天精通Java,第11天,java接口和抽象类的异同,default关键字
目录一、什么是接口二、接口的特点三、接口和类的区别四、接口和抽象类的区别五、接口的声明方式六、default默认方法大家好,我是哪吒。 一、什么是接口 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的…...
JAVA练习99-逆波兰表达式求值
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、题目-逆波兰表达式求值 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示:这里可以添加本文要记录的大概内容: 4月5…...

恶意软件、恶意软件反杀技术以及反病毒技术的详细介绍
1.恶意软件简单介绍恶意软件是指在计算机系统上执行恶意任务的病毒、蠕虫和特洛伊木马的程序,通过破坏软件进程来实施控制。腾讯移动安全实验室发布的数据显示,恶意软件由多种威胁组成,会不断弹出,所以需要采取多种方法和技术来进…...

【数据库运维】mysql备份恢复练习
目录 数据库备份,数据库为school,素材如下 1.创建student和score表 2.为student表和score表增加记录 3.备份数据库school到/backup目录 4.备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库 5.直接将My…...

刷题30-对称的二叉树
对称的二叉树 思路:用递归,首先明白递归中止的条件是什么 搬用别人的看法: 做递归思考三步: 1.递归的函数要干什么? 函数的作用是判断传入的两个树是否镜像。 输入:TreeNode left, TreeNode right 输出…...

精选简历模板
1.应届生通用简历模板(.docx) 适用于应届生找工作的学生群体 https://download.csdn.net/download/weixin_43042683/87652099https://download.csdn.net/download/weixin_43042683/87652099 部分缩略图如下: 2.研究生通用简历模板(.docx)…...

蓝桥杯嵌入式第十三届客观题解析
文章目录 前言一、题目1二、题目2三、题目3四、题目4五、题目5六、题目6七、题目7八、题目8九、题目9十、题目10总结前言 本篇文章将带大家来学习蓝桥杯嵌入式的客观题了,蓝桥杯嵌入式的客观题涉及到模电,数电,单片机等知识,需要非常扎实的基础,客观题不能急于求成只能脚…...

【Redis】线程问题
文章目录单线程版本演化工作流程为什么逐渐又加入了多线程特性?影响Redis性能的主要因素->网络I/O多线程工作流程Unix网络编程中的五种I/O模型I/O多路复用工作原理:select、poll、epoll为什么Redis快单线程与多线程的比较配置文件开启多线程单线程 版本演化 Re…...

【算法题】2498. 青蛙过河 II
题目: 给你一个下标从 0 开始的整数数组 stones ,数组中的元素 严格递增 ,表示一条河中石头的位置。 一只青蛙一开始在第一块石头上,它想到达最后一块石头,然后回到第一块石头。同时每块石头 至多 到达 一次。 一次…...

【新2023Q2押题JAVA】华为OD机试 - 整理扑克牌
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:整理扑克牌 题目 给定一组数…...

【hello C语言】文件操作
目录 1. 什么是文件? 2. 程序文件 3. 数据文件 4. 文件名 5. 文件类型 5.1 二进制文件 5.2 文本文件 5.3 数据在内存中的存储 6. 文件缓冲区 7. 文件指针 8. 文件的打开和关闭 9. 文件的顺序读写 10. 文件的随机读写 10.1 fseek:根据文件指针的位置和偏移…...

OBCP第八章 OB运维、监控与异常处理-数据库监控
系统监控视图:系统视图 OceanBase 数据库为多租户架构,租户分为两种类型:普通租户以及 sys 租户。OceanBase 数据库系统表都存储在 sys 租户,且主键中存储租户号(tenant_id),区分每个租户的内容…...

已经提了离职,还有一周就走,公司突然把我移出企业微信,没法考勤打卡, 还要继续上班吗?...
黎明前的黑暗最容易出事,离职前的几天也最容易出幺蛾子,比如下面这位网友的遭遇:已经提了离职,还有一周就正式离职了,公司突然把我移出企业微信,没法考勤打卡了, 还要继续上班吗?该怎…...

Win11启用IE方法
呉師傅 Win11是微软目前的最新系统,尽管该系统非常不错,但是还是有很多不一样的地方,有的用户发现Win11没有了IE浏览器,那么Win11没有IE浏览器怎么办呢,有的旧网页需要IE浏览器才能进入,下面就给大家提供一…...

有人靠ChatGPT 狂赚200W !有人到现在,连账号都没开通......
作者| Mr.K 编辑| Emma来源| 技术领导力(ID:jishulingdaoli)互联网风水轮流转,当初元宇宙盛极一时之际,在一些知识付费平台上,任何一个关于元宇宙的课程或培训,都很热销,有一定号召力的博主,登…...

基于GD32F470的mbedtls 3DES算法测试
3DES加密算法介绍 3DES数据加密算法是一种可逆的对称加密算法,也称三重数据加密算法。3DES块加密算法的设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的密码算法,目前3DES作为DES…...

为什么一些人很瞧不起 Java?
前言 瞧不起Java的大概是因为: Java 被认为是一门“老”语言,过时了。事实上,Java 由于其稳定性和安全性,一直是企业级应用开发的首选语言。而且,Java 语言还在不断更新和发展,例如 Java 8 引入了很多新特…...

DropMAE: Masked Autoencoders with Spatial-Attention Dropout for Tracking Tasks
摘要 在本文中,我们研究了掩码自动编码器(MAE)预训练的视频基于匹配的下游任务,包括视觉目标跟踪(VOT)和视频对象分割(VOS)。MAE的一个简单扩展是在视频中随机掩码帧块并重建帧像…...
【shell 基础(11)循环之for】带列表:空格子串、换行子串、展开、命令替换、seq;不带列表:接受参数、类C
文章目录一. 带列表的for循环1. 语法2. 例子2.1. 循环字串2.2. 展开或命令替换:数字循环2.3 命令替换(输出换行)作为list二. 其他for循环1. 不带列表的循环2. 类C的for循环一. 带列表的for循环 1. 语法 for var in list do commanddone注意…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...