【Python】以邮件的方式定时发送一天的股票分析报告
【Python】以邮件的方式定时发送一天的股票分析报告
文章目录
- 【Python】以邮件的方式定时发送一天的股票分析报告
- 1、Python发送邮件
- 1)`EmailSender`封装
- 2)可能存在的问题
- 2、jinja2动态渲染html页面
- 3、阿里云OSS搭建图床
- 1)Python上传图片到OSS中
- 2)使用`PicGo`上传图片到OSS中
- 3)图片链接访问报错解决
- 4、APScheduler定时任务
- 1)APScheduler四个组件
- 2)配置scheduler调度器
假设我现在的需求是:
假设我已经实现了对某只股票的分时/日/周/月K线,以及对应指标(RSI,BOLL,OBV,MACD)的绘制。
如果我想让系统每天在股市结束后,给我发送关于几只自选股票的分析报告,我可以通过如下方式实现:
1)让系统对今天几只股票的分时/日/周/月K线以及对应指标进行计算和绘制;
2)绘制的图片自动上传到阿里云OSS中,并返回关于已上传图片的
url链接;3)根据给定的
html模板,利用Jinja2工具包,将今天的股票绘制结果动态渲染到html中4)系统将生成的
html文件以邮件的形式发送到指定的收件人中;
这里分成4个模块,依次对邮件发送、html模板渲染、图床搭建、定时任务进行介绍,这里并没有给出实现这个需求的完整代码。
1、Python发送邮件
参考资料:
-
简单三步,用 Python 发邮件_程序员王饱饱的博客-CSDN博客_python 发送邮件
-
Python SMTP发送邮件 | 菜鸟教程
1)EmailSender封装
封装好的邮件发送类EmailSender代码如下:包括文本内容、带txt、pdf、图片和html的附件发送。
-
MIMEMultipart可以允许带附件; -
如果想添加一个
txt或者html文本附件,用MIMEText封装; -
如果想添加一个
pdf文本附件, 用MIMEApplication封装,参考# 【Mail小技巧】如何使用Python优雅的发送带有pdf附件的电子邮件; -
如果想添加一个照片附件,用
MIMEImage封装;
# 参考 https://blog.csdn.net/weixin_55154866/article/details/128098092
# 参考 https://www.runoob.com/python/python-email.html
# 参考 https://blog.csdn.net/YP_FlowerSky/article/details/124451913
import smtplib
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
import pdfplumber
from pathlib import Pathclass EmailSender:def __init__(self,mail_host,mail_user,mail_pass,sender):'''@param mail_host 设置登录及服务器信息,比如网易邮箱是smtp.163.com; type=str@param mail_user 邮箱用户名; type=str@param mail_pass 邮箱授权码; type=str@param sender 邮件发送方邮箱地址; type=str'''self.mail_host = mail_hostself.mail_user = mail_userself.mail_pass = mail_passself.sender = sender'''初始化一封邮件'''def init_email(self,receivers,content,subject):'''@param receivers 接收方邮箱集合,适合群发; type=list@param content 文本内容;type=str@param subject 主题; type=str'''# 参考 https://blog.csdn.net/YP_FlowerSky/article/details/124451913self.receivers = receivers# 添加一个MIMEmultipart类,处理正文及附件self.message = MIMEMultipart() #MIMEMultipart可以允许带附件self.message['From'] = self.sender #发送方邮箱地址self.message['To'] = ','.join(receivers) #接收方邮箱地址, 将['1046474088@qq.com','2802428220@qq.com']处理成'1046474088@qq.com,2802428220@qq.com'的strself.message['Subject'] = subjectself.message.attach(MIMEText(content,'plain', 'utf-8')) # 文本内容 (plain文本格式,utf-8编码)'''为邮件添加附件'''def email_wrapper(self,filePath,fileType="text"):'''@param filePath 文件路径; type=str@param fileType 文件类型,可选 ['text','html','image']; type=str'''if(fileType == 'text'):suffix = filePath.split(".")[-1]# 添加一个pdf文本附件, 用MIMEApplication封装 参考 https://blog.csdn.net/popboy29/article/details/126396549if (suffix == 'pdf'):with open(filePath, "rb") as f:pdf_attach = MIMEApplication(f.read(), _subtype="pdf")#如果出现邮件发送成功,但邮箱接收到的附件变为bin格式的情况时,检查add_header是否出错 参考https://blog.csdn.net/hxchuadian/article/details/125773738pdf_attach.add_header('Content-Disposition', 'attachment', filename=str(Path(filePath).name))self.message.attach(pdf_attach)else:#添加一个txt文本附件,用MIMEText封装with open(filePath,'r')as h:content2 = h.read()#设置txt参数text_attach = MIMEText(content2,'plain','utf-8')#附件设置内容类型,方便起见,设置为二进制流text_attach['Content-Type'] = 'application/octet-stream'#设置附件头,添加文件名text_attach['Content-Disposition'] = f'attachment;filename="{filePath}"'self.message.attach(text_attach)if (fileType == 'html'):# 推荐使用html格式的正文内容,这样比较灵活,可以附加图片地址,调整格式等with open(filePath,'r') as f:# 设置html格式参数html_attach = MIMEText(f.read(), 'base64', 'gb2312') # 将html文件以附件的形式发送html_attach['Content-Type'] = 'application/octet-stream'html_attach.add_header('Content-Disposition', 'attachment',filename=str(Path(filePath).name)) # filename是指下载的附件的命名self.message.attach(html_attach)if (fileType == 'image'):# 添加照片附件,用MIMEImage封装with open(filePath, 'rb') as fp:picture_attach = MIMEImage(fp.read())# 与txt文件设置相似picture_attach['Content-Type'] = 'application/octet-stream'picture_attach['Content-Disposition'] = f'attachment;filename="{filePath}"'# 将内容附加到邮件主体中self.message.attach(picture_attach)#登录并发送def sendEmail(self):try:smtpObj = smtplib.SMTP()smtpObj.connect(self.mail_host, 25)smtpObj.login(self.mail_user, self.mail_pass)smtpObj.sendmail(self.sender, self.receivers, self.message.as_string()) #receivers群发, receivers是一个列表['1046474088@qq.com','2802428220@qq.com']print('success')smtpObj.quit()except smtplib.SMTPException as e:print('error', e)
2)可能存在的问题
参考
-
如果出现
list‘ object has no attribute ‘encode‘_list' object has no attribute 'encode,主要原因是self.message['To']赋值有误,要想实现群发,需要将['1046474088@qq.com','2802428220@qq.com']处理成'1046474088@qq.com,2802428220@qq.com'的str类型参考Selenium /Python 配置QQ邮箱后台自动发送邮件unittest//发送多人邮件报错: ‘list‘ object has no attribute ‘encode‘_list’ object has no attribute 'encode
-
如果出现邮件发送成功,但邮箱接收到的附件变为
bin格式的情况时,检查add_header是否出错。可参考Python 发送邮件时图片附件变为bin格式的解决方案
2、jinja2动态渲染html页面
参考Python之jinja2模板引擎生成HTML_宗而研之的博客-CSDN博客_python 生成html
html模板如下:
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<html align='left'><body><h1>{{today}}股票分析报告</h1><table>{% for stock in stocks %}<tr align='center'><td>{{ stock.code }}</td><td>{{ stock.codeName }}</td><td><a href="{{stock.minute_kline_path}}">分时K线图</a> </td><td><a href="{{stock.daily_kline_path}}">日K线图</a> </td><td><a href="{{stock.week_kline_path}}">周K线图</a> </td><td><a href="{{stock.month_kline_path}}">月K线图</a> </td></tr>{% endfor%}</table></body>
</html>
python代码如下:
import datetimefrom jinja2 import Environment, FileSystemLoader
import datetimeimport sys
import os
from pathlib import Path
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)imgDir = os.path.join(rootPath,"html_task/temp/")def generate_html(today, stocks):env = Environment(loader=FileSystemLoader('./'))template = env.get_template('template.html')with open("result.html", 'w+') as fout:html_content = template.render(today=today,stocks=stocks)fout.write(html_content)if __name__ == "__main__":today = datetime.datetime.now().strftime("%Y-%m-%d")stocks = []stock1_path = os.path.join(imgDir,"sh601728")stock2_path = os.path.join(imgDir,"sz000722")stock1 = {'code': 'sh601728', 'codeName': '中国电信','minute_kline_path': stock1_path + "/" + "minute_K_line.png",'daily_kline_path': stock1_path + "/" + "daily_K_line.png",'week_kline_path': stock1_path + "/" + "week_K_line.png","month_kline_path" : stock1_path + "/" + "month_K_line.png", }stock2 = {'code': 'sz000722', 'codeName': '湖南发展','minute_kline_path': stock2_path + "/" + "minute_K_line.png",'daily_kline_path': stock2_path + "/" + "daily_K_line.png",'week_kline_path': stock2_path + "/" + "week_K_line.png","month_kline_path" : stock2_path + "/" + "month_K_line.png", }stocks.append(stock1)stocks.append(stock2)generate_html(today, stocks) #图片无法正常显示,会报错:Not allowed to load local resource# 图片无法正常显示 解决方法参考 http://www.kuazhi.com/post/319149.html
生成的html可视化效果如下:

但是存在一个问题 - 点击链接并不能正常下载或访问图片,主要原因是:浏览器出于安全方面的考虑,禁止网页访问本地文件,因为图片是存在项目目录下的,所以无法通过本地的url进行访问。(参考浏览器报错:Not allowed to load local resource 原因及解决办法_扭不开瓶盖的三水的博客-CSDN博客)
因此这里打算用图床返回的图片url链接来解决Not allowed to load local resource问题。
3、阿里云OSS搭建图床
参考
-
阿里云 oss 服务 —— 上传图片,获取url
-
阿里云OSS使用流程
-
使用阿里云OSS搭建图床 - 简书
1)Python上传图片到OSS中
使用python将图片上传到阿里云OSS(挺便宜的,买了1年9 rmb的资源包)中,然后通过url链接访问图片。其中建议使用RAM用户的ACCESS_KEY_ID和ACCESS_KEY_SECRET,BUCKET_NAME是购买的OSS实例名称,ENDPOINT是这个OSS实例的地域节点,具体获取方式参考阿里云OSS使用流程
# 使用阿里云OSS + picGo搭建图床 参考 https://www.jianshu.com/p/111ce9603ea6l# -*- coding: utf-8 -*-
import datetime
import oss2
import unittest# 阿里云OSS使用流程 参考 https://zhuanlan.zhihu.com/p/567771838
ACCESS_KEY_ID = "LTAI5*****Hu6m" #RAM账号access_key_id,如果没有用主账号登录工作台创建并授权,关于RAM角色参考 https://ram.console.aliyun.com/roles
ACCESS_KEY_SECRET = "mkit8YsLh*****TYmoh1QRzK" #RAM账号access_key_secret
ENDPOINT = "oss-cn-shenzhen.aliyuncs.com" #可以在bucket中获取地域节点endpoint 参考 https://zhuanlan.zhihu.com/p/567771838
BUCKET_NAME = "w*****i-20200401"#参考 https://www.likecs.com/show-308529932.html#sc=900
class Oss:"""oss存储类上传bytes流,返回状态码和url"""def __init__(self, access_key_id=ACCESS_KEY_ID, access_key_secret=ACCESS_KEY_SECRET,endpoint=ENDPOINT, bucket_name=BUCKET_NAME):# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth(access_key_id, access_key_secret)# Endpoint以杭州为例,其它Region请按实际情况填写。'http://oss-cn-hangzhou.aliyuncs.com'self.bucket = oss2.Bucket(auth, endpoint, bucket_name)def upload_bytes(self, file_bytes, image_name):"""上传bytes文件"""result = self.bucket.put_object('{}'.format(image_name), file_bytes)class OSSTest(unittest.TestCase):def test_oss_uploadFile(self):oss_obj = Oss()with open("temp/sh601728/minute_K_line.png","rb") as f:oss_obj.upload_bytes(f.read(),"minute_K_line.png")def test_oss_downloadFile(self):# 上传后,可以访问的 url 的组成photo_name = 'minute_K_line.png'domain = f'https://{BUCKET_NAME}.{ENDPOINT}/'url_photo = domain + photo_nameprint(url_photo)#访问该图片时可能会报错:You have no right to access this object because of bucket acl.# 解决方法:在bucket的权限控制中,将私有修改为公共读 参考 https://blog.csdn.net/zsy3757486/article/details/126938973
2)使用PicGo上传图片到OSS中
在官网[Releases · Molunerfinn/PicGo · GitHub](https://github.com/Molunerfinn/PicGo/releases)下载安装好PicGo之后,在图床配置中配置好阿里云OSS的ACCESS_KEY_ID、ACCESS_KEY_SECRET、BUCKET_NAME和存储区域地址后,即可实现图片上传,具体参考使用阿里云OSS搭建图床 - 简书
3)图片链接访问报错解决
正常情况下上传到图片可以通过如下链接访问:
https://{BUCKET_NAME}.{ENDPOINT}/photo_name #photo_name是上传到图片名称
但是在测试图片url连接时可能会报错:You have no right to access this object because of bucket acl.
解决方法:在bucket的权限控制中,将私有修改为公共读。参考【阿里云OSS】You have no right to access this object because of bucket acl._路遥叶子的博客-CSDN博客
4、APScheduler定时任务
参考
- Python 定时任务的实现方式
- BlockingScheduler与BackgroundScheduler区别
- APScheduler 定时任务详解
APScheduler定时框架:终于找到了可以每天定时喊我起床的方式了
APScheduler是一个 Python 定时任务框架,使用起来十分方便。提供了基于日期、固定时间间隔以及 crontab 类型的任务,并且可以持久化任务、并以 daemon 方式运行应用。
使用 APScheduler 需要安装
pip install apscheduler
首先来看一个周一到周五每天早上6点半喊我起床的例子
from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime
# 输出时间
def job():print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# BlockingScheduler
scheduler = BlockingScheduler()
scheduler.add_job(job, 'cron', day_of_week='1-5', hour=6, minute=30)
scheduler.start()
1)APScheduler四个组件
APScheduler 四个组件分别为:触发器(trigger),作业存储(job store),执行器(executor),调度器(scheduler)。
a、触发器(trigger)
包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行。除了他们自己初始配置意外,触发器完全是无状态的
APScheduler 有三种内建的 trigger:
date: 特定的时间点触发
interval: 固定时间间隔触发
cron: 在特定时间周期性地触发
b、作业存储(job store)
存储被调度的作业,默认的作业存储是简单地把作业保存在内存中,其他的作业存储是将作业保存在数据库中。一个作业的数据讲在保存在持久化作业存储时被序列化,并在加载时被反序列化。调度器不能分享同一个作业存储。
APScheduler 默认使用 MemoryJobStore,可以修改使用 DB 存储方案
c、执行器(executor)
处理作业的运行,他们通常通过在作业中提交制定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。
最常用的 executor 有两种:
ProcessPoolExecutor
ThreadPoolExecutor
d、调度器(scheduler)
通常在应用中只有一个调度器,应用的开发者通常不会直接处理作业存储、调度器和触发器,相反,调度器提供了处理这些的合适的接口。配置作业存储和执行器可以在调度器中完成,例如添加、修改和移除作业。
2)配置scheduler调度器
APScheduler提供了许多不同的方式来配置调度器,你可以使用一个配置字典或者作为参数关键字的方式传入。你也可以先创建调度器,再配置和添加作业,这样你可以在不同的环境中得到更大的灵活性。
下面来看一个简单的 BlockingScheduler 例子
from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetimedef job():print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# 定义BlockingScheduler
sched = BlockingScheduler()
sched.add_job(job, 'interval', seconds=5)
sched.start()
上述代码创建了一个 BlockingScheduler,并使用默认内存存储和默认执行器。(默认选项分别是 MemoryJobStore 和 ThreadPoolExecutor,其中线程池的最大线程数为10)。配置完成后使用 start() 方法来启动。
如果要给job传参,可以在add_job中使用args参数,如果要给job设置指定id,可以使用id参数
rom datetime import datetimefrom apscheduler.schedulers.blocking import BlockingSchedulerdef func(name):now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')print(now + f" Hello world, {name}")scheduler = BlockingScheduler()
scheduler.add_job(func, 'interval', seconds=3, args=["desire"], id="func")
scheduler.start()
移除job:
- 1)通过job的ID来调用
remove_job方法 - 2)通过在
add_job()中得到的job实例调用remove()方法 - 如果一个job完成了调度(例如他的触发器不会再被触发), 它会自动被移除
如果job_id不存在,remove_job会报错,可以用try - except来处理
# remove
job = scheduler.add_job(func, 'interval', seconds=3, args=["desire"], id="job_remove")
job.remove()# remove_job
scheduler.add_job(func, 'interval', seconds=3, args=["desire"], id="job_remove")
scheduler.remove_job(job_id="job_remove")
终止调度器中的执行器:
scheduler.shutdown() #终止调度器中的任务存储器以及执行器
scheduler.shutdown(wait=False)
默认情况,会终止任务存储器以及执行器,然后等待所有目前执行的job完成后(自动终止),wait=False 此参数不会等待任何运行中的任务完成,直接终止。但是如果scheduler没有执行,shutdown()会报错。
相关文章:
【Python】以邮件的方式定时发送一天的股票分析报告
【Python】以邮件的方式定时发送一天的股票分析报告 文章目录【Python】以邮件的方式定时发送一天的股票分析报告1、Python发送邮件1)EmailSender封装2)可能存在的问题2、jinja2动态渲染html页面3、阿里云OSS搭建图床1)Python上传图片到OSS中…...
mybatis条件构造器(二)
mybatis条件构造器(二) 1 准备工作 1.1 建表sql语句(Emp表) SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS emp; CREATE TABLE emp (EMPNO int NOT NU…...
C++【类与对象】
文章目录类与对象(1)类与对象一1.0.面向过程和面向对象初步认识1.1.类的引入1.2.类的定义1.3.类的访问限定符及封装1.4.类的作用域1.5.类的实例化1.6.类的对象大小的计算1.8.类成员函数的this指针(2)类与对象二2.0类的6个默认成员…...
假设检验选择统计量重点-----正态总体参数的假设检验
文章目录单个正态总体参数的假设检验单个正态总体N(μ,σ2)N(\mu,\sigma^2)N(μ,σ2)的均值μ\muμ的假设检验1.σ2\sigma^2σ2已知(U检验法)单个正态总体方差的假设检验单边检验简介--计算拒绝域两个正态总体参数的假设检验方差已知的两正态总体均值的假设检验均值未知的两正态…...
华为OD机试 - 通信误码(Python) | 机试题算法思路 【2023】
最近更新的博客 华为OD机试 - 自动曝光(Python) | 机试题算法思路 【2023】 华为OD机试 - 双十一(Python) | 机试题算法思路 【2023】 华为OD机试 - 删除最少字符(Python) | 机试题算法思路 【2023-02】 华为OD机试 - Excel 单元格数值统计(Python) | 机试题算法思路 …...
设计模式之装饰者模式
文章の目录一、什么是装饰者模式二、优势三、缺点四、应用场景五、示例参考写在最后一、什么是装饰者模式 装饰者模式也称为包装器模式,在不改变原有对象的基础上为其动态的添加上新的功能。 装饰者模式有以下特点: 添加功能时不改变原对象结构。装饰…...
【第31天】SQL进阶-写优化- 插入优化(SQL 小虚竹)
回城传送–》《31天SQL筑基》 文章目录零、前言一、练习题目二、SQL思路:SQL进阶-写优化-插入优化解法插入优化禁用索引语法如下适用数据库引擎非空表:禁用索引禁用唯一性检查语法如下适用数据库引擎禁用外键检查语法如下适用数据库引擎批量插入数据语法…...
SpringBoot自动装配的原理
前言 在开发SpringBoot项目时,当我们引入spring-boot-starter-xxx依赖后,想要使用依赖中的bean,直接就用Autowired拿来用了,不需要用xml或者注解的方式把它先注入到Spring容器中。这就是自动装配的特性,本文来讲述Spri…...
Vue3电商项目实战-分类模块5【12-二级类目-结果区-排序组件、13-二级类目-结果区-数据加载、14-二级类目-结果区-进行筛选】
文章目录12-二级类目-结果区-排序组件13-二级类目-结果区-数据加载14-二级类目-结果区-进行筛选12-二级类目-结果区-排序组件 目的:封装排序组件,完成排序切换效果 大致步骤: 定义一个组件 sub-sort,完成基础布局在 sub.vue 组件…...
计算机操作系统概述
文章目录1.0 操作系统概述1.1 操作系统的目标1.2 操作系统的功能1.3 操作系统结构1.4 操作系统接口1.5 操作系统的发展1.6 操作系统的特征2.0 进程管理2.1 进程调度2.2 进程调度算法2.3 进程间通信2.4 进程间的同步2.5 软件实现互斥的方法2.6 硬件实现互斥的方法2.7 信号2.8 管…...
面试官让你说说react状态管理?
hooks 为什么不能放在条件判断里 以 setState 为例,在 react 内部,每个组件(Fiber)的 hooks 都是以链表的形式存在 memoizeState 属性中 update 阶段,每次调用 setState,链表就会执行 next 向后移动一步。如果将 setState 写在条…...
CUDA线程块的分配
为了确保能够真正地了解线程块的分配,接下来我们写一个简短的内核程序来输出线程块、线程、线程束和线程全局标号到屏幕上。现在,除非你使用的是 3.2 版本以上的 SDK否则内核中是不支持 printf的。因此,我们可以将数据传送回 CPU 端然后输出到…...
史密斯圆图
在射频、微波中,常常使用史密斯圆图来做阻抗匹配。在不涉及复杂的数学推导,仍能把圆图用起来。 比如,共轭匹配。 RL1jX,需要找到-jX来抵消jX,消掉虚部之后,只留下实部,最终等效为RL‘1。 史密…...
Spring国际化实现
Java国际化 Java使用Unicode来处理所有字符。 Locales 国际化主要涉及的是数字、日期、金额等。 有若干个专门负责格式处理的类。为了对格式进行控制,可以使用Locale类。它描述了: 一种语言一个位置(通常包含)一段脚本(可选,自Java SE7开…...
10- 天猫用户复购预测 (机器学习集成算法) (项目十) *
项目难点 merchant: 商人重命名列名: user_log.rename(columns{seller_id:merchant_id}, inplaceTrue)数据类型转换: user_log[item_id] user_log[item_id].astype(int32)主要使用方法: xgboost, lightbm竞赛地址: 天猫复购预测之挑战Baseline_学习赛_天池大赛-阿里云天池…...
对于《MySQL 实战45讲》的理解
一.理论 一条SQL执行过程 连接器分析器优化器执行器 索引 索引的出现其实就是为了提高数据查询的效率,就像书的目录一样 常见索引数据结构(每碰到一个新数据库,我们需要先关注它的数据模型,这样才能从理论上分析出这个数据库的适用场景) 哈希…...
XQuery 函数
XQuery 1.0、XPath 2.0 以及 XSLT 2.0 共享相同的函数库。 XQuery 函数 XQuery 含有超过 100 个内建的函数。这些函数可用于字符串值、数值、日期以及时间比较、节点和 QName 操作、序列操作、逻辑值等等。您也可在 XQuery 中定义自己的函数。 XQuery 内建函数 XQuery 函数命…...
Elasticsearch的安装及常用操作
文章目录一、Elasticsearch的介绍1、Elasticsearch索引2、Elasticsearch的介绍二、Elasticsearch的安装1、安装ES服务2、安装kibana3、Docker安装ES4、Docker安装Kibana三、ES的常用操作1、索引操作2、文档操作3、域的属性3.1 index3.2 type3.3 store总结一、Elasticsearch的介…...
网络安全应急响应服务方案怎么写?包含哪些阶段?一文带你了解!
文章目录一、服务范围及流程1.1 服务范围1.2 服务流程及内容二、准备阶段2.1 负责人准备内容2.2 技术人员准备内容(一)服务需求界定(二)主机和网络设备安全初始化快照和备份2.3市场人员准备内容(1)预防和预…...
11、事务原理和实战,MVCC
事务原理和实战 1. 认识事务2. 事务控制语句2.1 开启事务2.2 事务提交2.3 事务回滚3. 事务的实现方式3.1 原子性3.2 一致性3.3 隔离性3.3 持久性4purge thread线程5事务统计QPS与TPS5.1 QPS5.2 TPS6. 事务隔离级别6.1 隔离级别6.2 查看隔离级别6.3 设置隔离级别6.4 不同隔离级别…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...

