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

构建高效的大数据量延迟任务调度平台

目录

  1. 引言
  2. 系统需求分析
  3. 系统架构设计
    • 总体架构
    • 任务调度模块
    • 任务存储模块
    • 任务执行模块
  4. 任务调度算法
    • 时间轮算法
    • 优先级队列
    • 分布式锁
  5. 数据存储方案
    • 关系型数据库
    • NoSQL数据库
    • 混合存储方案
  6. 容错和高可用性
    • 主从复制
    • 数据备份与恢复
    • 故障转移
  7. 性能优化
    • 水平扩展
    • 缓存机制
    • 异步处理
  8. 监控与运维
    • 监控指标
    • 报警系统
    • 日志管理
  9. 总结

引言

延迟任务调度是指在未来某个特定时间执行特定任务的能力。这种能力在各种应用场景中都非常有用,比如电商平台上的优惠券过期提醒、社交网络中的生日提醒以及大型数据处理系统中的定时数据清洗任务等。

在处理大规模数据量时,延迟任务调度平台需要具备高性能、可扩展性和高可用性。因此,我们需要一个精心设计的系统架构来满足这些需求。

系统需求分析

在设计大数据量延迟任务调度平台之前,我们首先需要明确系统的需求:

  1. 高并发支持:系统需要处理大量并发请求,包括任务的创建、查询和执行。
  2. 高可用性:系统需要在任何时候都能够正常运行,避免单点故障。
  3. 任务精确性:任务需要在指定时间精确执行。
  4. 可扩展性:系统需要能够平滑扩展,以支持不断增长的数据量。
  5. 数据一致性:在分布式环境中,系统需要保证数据的一致性。

系统架构设计

总体架构

一个典型的大数据量延迟任务调度平台可以分为以下几个模块:

  1. 任务调度模块:负责管理和调度任务,确保任务在指定时间执行。
  2. 任务存储模块:负责存储任务的详细信息,包括任务的创建时间、执行时间和状态等。
  3. 任务执行模块:负责实际执行任务,并将任务执行结果反馈给系统。

下图展示了系统的总体架构:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

任务调度模块

任务调度模块是系统的核心,它负责定时扫描任务存储模块中的任务,并在合适的时间将任务推送给任务执行模块。为了提高效率,我们可以使用多种调度算法,如时间轮算法和优先级队列。

任务存储模块

任务存储模块需要能够高效地存储和检索任务信息。在处理大规模数据时,我们需要选择合适的数据库方案,如关系型数据库、NoSQL数据库,或者两者结合使用。

任务执行模块

任务执行模块负责实际执行任务。这一模块需要具备高并发处理能力,并且能够处理任务执行过程中可能出现的各种异常情况。

任务调度算法

时间轮算法

时间轮算法是一种高效的定时任务调度算法,适用于处理大量定时任务。时间轮的基本思想是将时间划分为多个时间片,每个时间片对应一个槽(slot),槽中存储需要在该时间片执行的任务。

时间轮结构

时间轮可以看作是一个循环数组,每个数组元素代表一个时间槽。时间槽中存储的是需要在相应时间点执行的任务列表。时间轮的大小取决于系统的精度要求。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

时间轮的操作
  1. 任务添加:根据任务的延迟时间计算任务需要插入的时间槽,并将任务添加到该时间槽中。
  2. 时间推进:时间轮按时间推进,每次推进一个时间槽,当时间轮指针指向某个时间槽时,执行该时间槽中的所有任务。
  3. 任务执行:将时间槽中的任务取出并执行,如果任务需要再次延迟,则重新计算其插入的时间槽。

优先级队列

优先级队列是一种常见的数据结构,适用于需要按优先级顺序处理任务的场景。在延迟任务调度中,我们可以使用优先级队列将任务按执行时间排序,保证任务按时执行。

优先级队列实现

优先级队列可以使用最小堆(min-heap)来实现,其中堆顶元素是优先级最高(执行时间最早)的任务。任务的添加和删除操作的时间复杂度均为O(log N)。

优先级队列的操作
  1. 任务添加:将任务插入到优先级队列中,并保持堆的性质。
  2. 任务取出:取出堆顶的任务,并重新调整堆结构。
  3. 任务执行:按顺序执行取出的任务,如果任务需要再次延迟,则重新插入优先级队列。

分布式锁

在分布式系统中,为了避免多个实例同时处理同一个任务,我们需要使用分布式锁来保证任务的唯一性执行。常见的分布式锁实现方式包括基于数据库的分布式锁、基于Redis的分布式锁以及基于ZooKeeper的分布式锁。

基于Redis的分布式锁

Redis是一个高性能的键值数据库,可以用来实现分布式锁。以下是一个简单的基于Redis分布式锁的实现:

import redis
import time
import uuidclass RedisLock:def __init__(self, client, lock_key, timeout=10):self.client = clientself.lock_key = lock_keyself.timeout = timeoutself.lock_id = str(uuid.uuid4())def acquire(self):return self.client.set(self.lock_key, self.lock_id, nx=True, ex=self.timeout)def release(self):lock_value = self.client.get(self.lock_key)if lock_value and lock_value.decode() == self.lock_id:self.client.delete(self.lock_key)# 使用示例
client = redis.Redis(host='localhost', port=6379, db=0)
lock = RedisLock(client, 'my_lock_key')if lock.acquire():try:# 执行任务passfinally:lock.release()

数据存储方案

关系型数据库

关系型数据库(如MySQL、PostgreSQL)以其强大的事务处理能力和数据一致性保障,常用于存储结构化数据。在延迟任务调度平台中,关系型数据库可以用来存储任务的元数据和执行记录。

表结构设计
CREATE TABLE tasks (id BIGINT AUTO_INCREMENT PRIMARY KEY,task_name VARCHAR(255) NOT NULL,execute_at TIMESTAMP NOT NULL,status VARCHAR(50) NOT NULL,payload TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);CREATE INDEX idx_execute_at ON tasks(execute_at);

NoSQL数据库

NoSQL数据库(如MongoDB、Cassandra)具有高扩展性和高可用性的特点,适用于存储海量数据。在延迟任务调度平台中,NoSQL数据库可以用来存储大量的任务数据,尤其是当任务的结构不固定时。

示例:MongoDB任务存储
db.tasks.createIndex({ "execute_at": 1 });db.tasks.insert({task_name: "example_task",execute_at: ISODate("2023-06-19T12:00:00Z"),status: "pending",payload: {...},created_at: new Date(),updated_at: new Date()
});

混合存储方案

在实际应用中,我们可以结合使用关系型数据库和NoSQL数据库,以发挥各自的优势。例如,我们可以使用关系型数据库存储关键的任务元数据,使用NoSQL数据库存储大量的任务日志和执行数据。

容错和高可用性

主从复制

主从复制是一种常见的数据冗余方案,通过将数据复制到多个节点,提高系统的可靠性和可用性。在延迟任务调度平台中,我们可以使用主从复制来保证任务数据的高可用性。

示例:MySQL主从复制配置

在主服务器上添加如下配置:

[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = tasks_db

在从服务器上添加如下配置:

[mysqld]
server-id = 2
replicate-do-db = tasks_db

在主服务器上创建复制用户:

CREATE USER 'replica_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;

在从服务器上启动复制:

CHANGE MASTER TO MASTER_HOST='主服务器IP', MASTER_USER='replica_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0;
START SLAVE;

数据备份与恢复

定期数据备份是保证数据安全的重要手段。在延迟任务调度平台中,我们需要定期备份任务数据,以应对可能的数据丢失情况。

示例:使用mysqldump备份MySQL数据库
mysqldump -u username -p tasks_db > tasks_db_backup.sql

恢复数据库:

mysql -u username -p tasks_db < tasks_db_backup.sql

故障转移

故障转移是指当系统中的某个组件发生故障时,系统能够自动切换到备用组件,以保证系统的持续运行。在延迟任务调度平台中,我们可以使用故障转移机制来提高系统的高可用性。

示例:使用Keepalived实现MySQL故障转移

安装Keepalived:

sudo apt-get install keepalived

配置Keepalived:

vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1234}virtual_ipaddress {192.168.1.100}
}

启动Keepalived:

sudo service keepalived start

性能优化

水平扩展

水平扩展是指通过增加更多的服务器节点来提升系统的处理能力。在延迟任务调度平台中,我们可以通过水平扩展调度模块和存储模块来提高系统的并发处理能力。

示例:使用Kubernetes进行容器化部署

编写Kubernetes Deployment配置文件:

apiVersion: apps/v1
kind: Deployment
metadata:name: scheduler-deployment
spec:replicas: 3selector:matchLabels:app: schedulertemplate:metadata:labels:app: schedulerspec:containers:- name: schedulerimage: scheduler-image:latestports:- containerPort: 8080

部署应用:

kubectl apply -f scheduler-deployment.yaml

缓存机制

缓存机制可以显著提高系统的性能,减少数据库的访问压力。在延迟任务调度平台中,我们可以使用缓存来存储频繁访问的任务数据。

示例:使用Redis缓存任务数据
import redis
import jsonclass TaskCache:def __init__(self, client):self.client = clientdef get_task(self, task_id):task_data = self.client.get(task_id)if task_data:return json.loads(task_data)return Nonedef set_task(self, task_id, task_data, expire_time=3600):self.client.set(task_id, json.dumps(task_data), ex=expire_time)# 使用示例
client = redis.Redis(host='localhost', port=6379, db=0)
cache = TaskCache(client)# 设置任务缓存
cache.set_task('task_123', {'task_name': 'example_task', 'execute_at': '2023-06-19T12:00:00Z'})# 获取任务缓存
task_data = cache.get_task('task_123')

异步处理

异步处理可以有效提高系统的响应速度,减少任务的执行延迟。在延迟任务调度平台中,我们可以使用异步处理来执行耗时任务。

示例:使用Celery实现异步任务执行

安装Celery和Redis:

pip install celery[redis]

配置Celery:

from celery import Celeryapp = Celery('tasks', broker='redis://localhost:6379/0')@app.task
def execute_task(task_data):# 执行任务pass

发送异步任务:

from tasks import execute_tasktask_data = {'task_name': 'example_task', 'execute_at': '2023-06-19T12:00:00Z'}
execute_task.delay(task_data)

监控与运维

监控指标

监控是保证系统稳定运行的重要手段。在延迟任务调度平台中,我们需要监控以下指标:

  1. 任务处理量:每秒处理的任务数量。
  2. 任务延迟:任务实际执行时间与预定执行时间的差异。
  3. 系统资源使用情况:CPU、内存、磁盘和网络的使用情况。
  4. 错误率:任务执行失败的比例。

报警系统

报警系统可以及时发现并处理系统中的异常情况。在延迟任务调度平台中,我们可以设置多种报警规则,如任务执行超时、任务队列积压等。

示例:使用Prometheus和Alertmanager配置报警

配置Prometheus监控任务执行情况:

global:scrape_interval: 15sscrape_configs:- job_name: 'scheduler'static_configs:- targets: ['localhost:9090']

配置Alertmanager报警规则:

global:resolve_timeout: 5mroute:group_by: ['alertname']group_wait: 30sgroup_interval: 5mrepeat_interval: 3hreceiver: 'email'receivers:- name: 'email'email_configs:- to: 'admin@example.com'from: 'alertmanager@example.com'smarthost: 'smtp.example.com:587'auth_username: 'alertmanager'auth_password: 'password'inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'instance']

日志管理

日志是分析和调试系统问题的重要工具。在延迟任务调度平台中,我们需要记录详细的任务日志,包括任务的创建、调度和执行情况。

示例:使用ELK(Elasticsearch, Logstash, Kibana)进行日志管理

安装和配置Elasticsearch:

cluster.name: "scheduler-logs"
network.host: localhost

安装和配置Logstash:

input {file {path => "/var/log/scheduler/*.log"start_position => "beginning"}
}output {elasticsearch {hosts => ["localhost:9200"]index => "scheduler-logs-%{+YYYY.MM.dd}"}
}

安装和配置Kibana:

server.host: "localhost"
elasticsearch.hosts: ["http://localhost:9200"]

总结

构建一个高效的大数据量延迟任务调度平台是一个复杂而富有挑战性的任务。本文从系统需求分析入手,详细探讨了系统架构设计、任务调度算法、数据存储方案、容错和高可用性、性能优化以及监控与运维等方面的内容。通过合理的架构设计和技术选型,我们可以构建一个高性能、可扩展且高可用的延迟任务调度平台,为各类应用场景提供可靠的支持。希望本文能为广大技术人员在设计和实现延迟任务调度系统时提供有价值的参考。

相关文章:

构建高效的大数据量延迟任务调度平台

目录 引言系统需求分析系统架构设计 总体架构任务调度模块任务存储模块任务执行模块 任务调度算法 时间轮算法优先级队列分布式锁 数据存储方案 关系型数据库NoSQL数据库混合存储方案 容错和高可用性 主从复制数据备份与恢复故障转移 性能优化 水平扩展缓存机制异步处理 监控与…...

Python武器库开发-武器库篇之ThinkPHP 2.x 任意代码执行漏洞(六十三)

Python武器库开发-武器库篇之ThinkPHP 2.x 任意代码执行漏洞&#xff08;六十三&#xff09; PHP代码审计简介 PHP代码审计是指对PHP程序进行安全审计&#xff0c;以发现潜在的安全漏洞和风险。PHP是一种流行的服务器端脚本语言&#xff0c;广泛用于开发网站和Web应用程序。由…...

SQLite数据库(数据库和链表双向转换)

文章目录 SQLite数据库一、SQLite简介1、SQLite和MySQL2、基于嵌入式的数据库 二、SQLite数据库安装三、SQLite的常用命令四、SQLite的编程操作1、SQLite数据库相关API&#xff08;1&#xff09;头文件&#xff08;2&#xff09;sqlite3_open()&#xff08;3&#xff09;sqlite…...

React框架的来龙去脉,react的技术原理及技术难点和要点,小白的进阶之路

React 框架的来龙去脉&#xff1a;技术原理及技术难点和要点 1. React 的起源与发展 React 是由 Facebook 开发的一个用于构建用户界面的 JavaScript 库。它最初由 Jordan Walke 创建&#xff0c;并在 2013 年开源。React 的出现是为了解决在大型应用中管理复杂用户界面的问题…...

CPU飙升100%怎么办?字节跳动面试官告诉你答案!

小北说在前面 CPU占用率突然飙升是技术人员常遇到的一个棘手问题&#xff0c;它是一个与具体技术无关的普遍挑战。 这个问题可以很简单&#xff0c;也可以相当复杂。 有时候&#xff0c;只是一个死循环在作祟。 有时候&#xff0c;是死锁导致的。 有时候&#xff0c;代码中有…...

物理层(二)

2.2 传输介质 2.2.1 双绞线、同轴电缆、光纤和无线传输介质 传输介质也称传输媒体&#xff0c;是数据传输系统中发送器和接收器之间的物理通路。传输介质可分为:①导向传输介质&#xff0c;指铜线或光纤等&#xff0c;电磁波被导向为沿着固体介质传播:②)非导向传输介质&…...

C#——文件读取IO操作File类详情

文件读取操作 IO类 就是对应文件的操作的类I/O类 包含各种不同的类 用于执行各种文件操作&#xff0c;创建文件删除文件读写文件 常用的类: File处理文件操作的类 FilleStream用于文件当中任何位置的读写 File类 1.文件创建 File.Create() 在指定路径下创建…...

昨天gitee网站访问不了,开始以为电脑哪里有问题了

昨天gitee网站下午访问不了&#xff0c;开始以为是什么毛病。 结果同样的网络&#xff0c;手机是可以访问的。 当然就ping www.gitee.com 结果也下面那样是正常的 以为是好的&#xff0c;但就是访问www.gitee.com也是不行&#xff0c;后来用阿里云的服务器curl访问是下面情况&…...

深入理解适配器模式:Java实现与框架应用

适配器模式是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以协同工作。在本篇博客中&#xff0c;我们将详细介绍适配器模式&#xff0c;并演示如何在Java中实现它。最后&#xff0…...

跌倒识别:守护公共安全的AI技术应用场景-免费API调用

随着科技的不断进步&#xff0c;人工智能在各个领域的应用日益广泛&#xff0c;其中在公共安全领域&#xff0c;智能跌倒识别系统正逐渐成为守护人们安全的重要工具。本文将分享智能跌倒识别系统在不同场景下的应用及其重要性。 产品在线体验地址-API调用或本地化部署 AI算法模…...

算法:渐进记号的含义及时间复杂度计算

渐进记号及时间复杂度计算 渐近符号渐近记号 Ω \Omega Ω渐进记号 Θ \Theta Θ渐进记号小 ο \omicron ο渐进记号小 ω \omega ω渐进记号大 O \Omicron O常见的时间复杂度关系 时间复杂度计算&#xff1a;递归方程代入法迭代法套用公式法 渐近符号 渐近记号 Ω \Omega Ω …...

idea导入文件里面的子模块maven未识别处理解决办法

1、File → Project Structure → 点击“Modules” → 点击“” → “Import Model” 2、可以看到很多子模块&#xff0c;选择子模块下的 pom.xml 文件导入一个一个点累死了&#xff0c;父目录下也没有pom文件 解决办法&#xff1a;找到子模块中有一个pom.xml文件&#xff0c;…...

IOS Swift 从入门到精通:协议和扩展

文章目录 协议协议继承扩展协议扩展面向协议的编程总结&#xff1a; 今天你将学习一些真正的 Swifty 功能&#xff1a;协议和面向协议的编程&#xff08;POP&#xff09;。 POP 摒弃了庞大而复杂的继承层次结构&#xff0c;代之以更小、更简单、可以组合在一起的协议。这确实应…...

Vue插件开发:Vue.js的插件架构允许开发者扩展Vue的核心功能,我们可以探讨如何开发一个Vue插件并与社区分享

了解Vue插件 Vue插件的概念: Vue插件用于为Vue.js添加全局级别的功能。它提供了一种开箱即用的机制来应用全局性的功能扩展。这些插件通常用来将全局方法或属性,组件选项,Vue实例的方法,或者注入一些组件选项比如mixins和自定义方法添加至Vue.js。 Vue插件的使用场景:…...

学习面向对象前--Java基础练习题

前言 写给所有一起努力学习Java的朋友们&#xff0c;敲代码本身其实是我们梳理逻辑的一个过程。我们在学习Java代码的过程中&#xff0c;除了需要学习Java的一些基本操作及使用&#xff0c;更重要的是我们需要培养好的逻辑思维。逻辑梳理好之后&#xff0c;我们编写代码实现需要…...

用Python实现抖音新作品监控助手,实时获取博主动态

声明&#xff1a; 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。包含关注&#xff0c;点赞等 该项目的主要功能是通过Python代码&…...

图像分隔和深度成像技术为什么受市场欢迎-数字孪生技术和物联网智能汽车技术的大爆发?分析一下图像技术的前生后世

图像分隔和深度成像是计算机视觉和图像处理领域的两项重要技术&#xff0c;它们各自有不同的技术基础和要点。 图像分隔技术基础&#xff1a; 机器学习和模式识别&#xff1a; 图像分隔通常依赖于机器学习算法&#xff0c;如支持向量机&#xff08;SVM&#xff09;、随机森林…...

Redis 内存策略

一、Redis 内存回收 Redis 之所以性能强&#xff0c;最主要的原因就是基于内存存储。然而单节点的 Redis 其内存大小不宜过大&#xff0c;会影响持久化或主从同步性能。 我们可以通过修改配置文件来设置 Redis 的最大内存&#xff1a; # 格式&#xff1a; # maxmemory <byt…...

Java小实验————斗地主

早期使用的JavaSE用到的技术栈有&#xff1a;Map集合,数组&#xff0c;set集合&#xff0c;只是简单实现了斗地主的模拟阶段&#xff0c;感兴趣的小伙伴可以调试增加功能 代码如下&#xff1a; import java.util.*;public class Poker {public static void main(String[] arg…...

【Oracle】Linux 卸载重装 oracle 教程(如何清理干净残留)系统 CentOS7.6

总览 1.停止监听 2.删除 Oracle 数据库实例 3.删除 Oracle 相关服务 4.删除 Oracle 服务脚本 5.清理 Oracle 软件和配置文件 6.强制卸载 Oracle 软件包 一、开始干活&#xff08;所有操作使用 root 权限&#xff0c;在 root 用户下执行&#xff09; 1.停止监听 lsnrctl sto…...

web中间件漏洞-Jenkins漏洞-弱口令、反弹shell

web中间件漏洞-Jenkins漏洞-弱口令、反弹shell Jenkins弱口令 默认用户一般为jenkins/jenkins 使用admin/admin123登陆成功 Jenkins反弹shell 格式为 println"命令".execute().text 在/tmp目录中生成shell.sh文件&#xff0c;并向其中写入反弹shell的语句 new…...

Linux开发讲课9--- Linux的IPC机制-内存映射(Memory Mapping)

Linux的IPC&#xff08;Inter-Process Communication&#xff0c;进程间通信&#xff09;机制是多个进程之间相互沟通的方法&#xff0c;它允许不同进程之间传播或交换信息。Linux支持多种IPC方式&#xff0c;包括但不限于&#xff1a; 管道&#xff08;Pipe&#xff09;&#…...

Java赋值运算符

Java赋值运算符分为以下&#xff1a; 符号 作用 说明 赋值 int a 10,把10赋值给变量a 加后赋值 ab,将ab的值赋值给变量a - 减后赋值 a-b,将a-b的值赋值给变量a* 乘后赋值 a*b,将a*b的值赋值给变量a / 除后赋值 a/b,将a/b的值赋值给变量a % 取余赋值 a%b,将a%b的值赋值给变量…...

Qt做群控系统

群控系统顾名思义&#xff0c;一台设备控制多台机器。首先我们来创造下界面。我们通过QT UI设计界面。设计界面如下&#xff1a; 登录界面&#xff1a; 登录界面分为两种角色&#xff0c;一种是管理员&#xff0c;另一种是超级管理员。两种用户的主界面是不同的。通过选中记住…...

【专业英语 复习】第10章 Information System

1. 单选题 (1分) An example of this type of report would be a sales report that shows that certain items are selling significantly above or below forecasts. () A. Inventory B. Demand C. Periodic D. Exception 正确答案&#xff1a; D 这种类型的报…...

09-axios在Vue中的导入与配置

09-axios 前言首先简单了解什么是Axios&#xff1f;以上完成后就可以使用了 前言 我们接着上一篇文章 08-路由地址的数据获取 来讲。 下一篇文章 10-vuex在Vue中的导入与配置 首先简单了解什么是Axios&#xff1f; Axios是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端…...

odoo17 小变更4

odoo17 小变更4 1、代码中去除了访问私人地址权限,但翻译中均还有,怪不 model:res.groups,name:base.group_private_addresses msgid "Access to Private Addresses" msgstr "" 代码也查看了,的确没有了此权限组 --><record model="res.g…...

Flink assignTimestampsAndWatermarks 深度解析:时间语义与水印生成

目录 概述 时间语义 时间戳分配 水印的作用 最佳实践 案例分析 注意事项 应用场景 概述 在Apache Flink中,assignTimestampsAndWatermarks是一个重要的方法,它允许数据流处理程序根据事件时间(event time)分配时间戳和生成水印(watermarks)。这个方法通常用于处理…...

C++排序算法——合并有序数组

合并有序数组 思路 我们可以设想一个排序的函数 这个函数里 我们有三个while while(第一次的执行条件) {先进行第一次的合并 } while(第二次的合并条件) { 把a数组在第一次没有排序上的给加进去 }while(第三次的合并条件) { 把b数组在第一次没有排序上的给加进去 }看完了这个…...

安装pytorch环境

安装&#xff1a;Anaconda3 通过命令行查显卡nvidia-smi 打开Anacanda prompt 新建 conda create -n pytorch python3.6 在Previous PyTorch Versions | PyTorch选择1.70&#xff0c;安装成功&#xff0c;但torch.cuda.is_available 返回false conda install pytorch1.7.0…...

内卷从古到今就一直存在,并不是近年的“新物”,破局在于你是否有意识地学习。

一.背景&#xff1a; 反思自己过去从学生时代到职场时代。“内卷”其实已经一直存在&#xff0c;从古到今都一直存在&#xff0c;也并不是近几年产出的“新物”。已经连续5年高考人数在1000万以上&#xff0c;而今年1300多万达到新高&#xff0c;对于竞争压力如此之大&#xf…...

跟《经济学人》学英文:2024年6月15日这期 The war for AI talent is heating up

The war for AI talent is heating up Big tech firms scramble to fill gaps as brain drain sets in 争夺人工智能人才的战争正在升温 随着人才流失的到来&#xff0c;大型科技公司争相填补空缺 brain drain&#xff1a;人才流失 scramble&#xff1a;争夺&#xff1b;争…...

港湾周评|高盛眼中的618增长

《港湾商业观察》李镭 年中最重要的购物节618终于尘埃落定了。2024年的618各大电商平台竞技情况如何&#xff1f;又有哪些新的亮点&#xff1f;都成为外界观察消费行为的参考指标。 根据京东618数据显示&#xff1a;累计成交额过10亿的品牌83个&#xff0c;超15万个中小商家销…...

SPSS知识

特点 SPSS的一些特点&#xff1a; 分析结果清晰、直观&#xff1a;SPSS提供了丰富的图表和表格&#xff0c;可以帮助用户直观地理解数据分析的结果。分析结果通常包含详细的统计量、图形和文本描述&#xff0c;使得分析结果易于解释。 易学易用&#xff1a;SPSS的用户界面设计…...

【网络安全的神秘世界】关于Linux中一些好玩的字符游戏

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 佛祖保佑 把 motd 通过xtp拖到Linux中 liyangUbuntu2204:~$ cp motd /etc/motd #一定要放在etc下 liyangUbuntu2204:~$ exi…...

【LeetCode】Hot100:验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树 只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 英文题目 Given the root…...

[Qt] Qt Creator 编译输出乱码,问题页中的报错、警告内容,编译输出乱码

确保文件编码为"UTF-8"&#xff0c;"如果编码是UTF-8则添加"&#xff0c;如下图&#xff1a; 设置IDE环境语言跟随系统语言&#xff0c;Text codec for tools&#xff1a; "System" 瑞斯拜...

sed

1、sed的定义 sed是一种流编辑器&#xff0c;按行处理&#xff0c;一次处理一行内容 处理方式&#xff1a;如果只是展示&#xff0c;会放在缓冲区&#xff08;模式空间&#xff09;&#xff0c;展示结束后&#xff0c;会从模式空间把操作结果删除 一行一行处理&#xff0c;处…...

C++一文讲透thread中的detach和join的差别

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、thread详解二、线程何时运行三、线程启动方式1.join2.detach 总结 前言 无论哪种语言线程在绝大多数项目中都是会用到的&#xff0c;C也一样&#xff0c;C…...

当Windows台式电脑或笔记本电脑随机关机时,请先从这8个方面检查

序言 你的Windows笔记本电脑或PC是否意外关闭?笔记本电脑电池故障、电源线松动、过热、电源设置错误、驱动程序过时或电脑组件故障等问题都可能是罪魁祸首。如果你对这个问题感到沮丧,试试这些解决方案。 进行一些初步检查 与从电池中获取电力的笔记本电脑不同,台式电脑依…...

【凤凰房产-注册安全分析报告-缺少轨迹的滑动条】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…...

【建议收藏】逻辑回归面试题,机器学习干货、重点。

. . . . . . . . . . .纯 干 货 . . . . . . . . . . . .今天是机器学习面试题&#xff0c;16大块的内容&#xff0c;124个问题总结的第二期&#xff1a;逻辑回归面试题。 逻辑回归是一种用于解决分类问题的统计学习方法&#xff0c;尤其在二分类…...

C++使用教程

目录 一、软件使用 二、C基础规则补充 关键字 整型取值范围 浮点型取值范围 字符型使用规则 字符串型使用规则 布尔类型 常用的转义移字符 三、数组、函数、指针、结构体补充 1.数组 2.函数 声明&#xff1a; 分文件编写&#xff1a; 值传递&#xff1a; 3.指…...

k8s volcano + deepspeed多机训练 + RDMA ROCE+ 用户权限安全方案【建议收藏】

前提&#xff1a;nvidia、cuda、nvidia-fabricmanager等相关的组件已经在宿主机正确安装&#xff0c;如果没有安装可以参考我之前发的文章GPU A800 A100系列NVIDIA环境和PyTorch2.0基础环境配置【建议收藏】_a800多卡运行环境配置-CSDN博客文章浏览阅读1.1k次&#xff0c;点赞8…...

设计模式(七)创建者模式之建造者模式

这里写目录标题 概述需求需求类图BikeBuilderMobikeBuilderOfoBuilderDirectorClientClient优缺点使用场景 模式扩展ComputerClient创建者模式对比工厂方法模式VS建造者模式抽象工厂模式VS建造者模式 总结 概述 建造者模式又叫生成器模式&#xff0c;是一种对象构建模式。它可…...

# class中的__call__方法解析

class中的__call__方法解析 文章目录 class中的__call__方法解析1. 为什么要有call&#xff0c;什么情况下用call&#xff1f;1.1 为什么要有 __call__ 方法1.2 没有 __call__ 方法是否可以1.3 使用 __call__ 方法的典型场景1.3.1 示例1&#xff1a;简单函数对象1.3.2 示例2&am…...

React逻辑复用的方式都有哪些

在日常开发中&#xff0c;能够优雅的复用组件和逻辑&#xff0c;是优秀开发者的职责。在react中&#xff0c;复用逻辑的方式有很多&#xff0c;可以适用于不同的业务场景。今天说三个比较有代表性的&#xff0c;Render Props、HOC、Hooks Render Props 创建一个接受函数作为其…...

【LinuxC语言】线程重入

文章目录 前言线程重入是什么线程重入实现示例代码总结前言 在并发编程中,我们经常需要处理多个线程同时访问和修改共享资源的问题。这可能会导致数据竞争和状态不一致,从而使程序的行为变得不可预测。为了解决这个问题,我们引入了一种称为“线程重入”的机制。线程重入,或…...

【Streamlit学习笔记】Streamlit-ECharts箱型图添加均值和最值label

Streamlit-ECharts Streamlit-ECharts是一个Streamlit组件&#xff0c;用于在Python应用程序中展示ECharts图表。ECharts是一个由百度开发的JavaScript数据可视化库Apache ECharts 安装模块库 pip install streamlitpip install streamlit-echarts绘制箱型图展示 在基础箱型…...

Docker镜像仓库:存储与分发Docker镜像的中央仓库

探索Docker镜像仓库&#xff1a;存储与分发Docker镜像的中央仓库 如果你是Docker的新手&#xff0c;或者已经在使用Docker但还不太了解Docker镜像仓库&#xff0c;那么这篇博客将是你的最佳指南。我们将从基础概念开始&#xff0c;逐步深入&#xff0c;帮助你全面掌握Docker注…...