是一种http的安全协议,在tcp ip网络模型里,http应用层是在tcp 传输层之上的,http协议规定了在tcp传输层之上还有一层tls/ssl层,这一层对http应用层发出去和接收的报文做加密和解密。
出现http原因,在我看来有两点
1,因为http是明文传输,极不安全,需要对报文进行加密。
2,我们无法确认浏览的网站的身份信息,如果是钓鱼网站,诱使我们输入银行账号密码之类的就麻烦了。
简而言之,「http规定了 加密算法对报文进行加密,解决明文传输的问题。采用数字证书的方式解决对服务端的身份认证问题」。
对称加密是加密和解密都采用同一个密钥。 非对称加密 将密钥分为公钥和私钥, 公钥进行加密的报文,用私钥可以解密。私钥加密的报文,用公钥可以解密(这种加密方式也是数字证书采用的原理)
一般对称加密会比非对称加密性能高几个数量级。但是就安全性而言,非对称加密安全性会更高,那么http采用的是什么加密方式呢?
由于对称加密性能更好,所以http在真正加密报文时还是采用的对称加密方式,但是对称加密的密钥是通过非对称加密协商后传给对方的。这样的加密方式就能保证在性能更好的前提下也有不错的安全性。
数字证书 是一个可信组织验证和签发的识别信息。有点类似于现实生活中的身份证,公安机关给我们颁发身份证为的就是证明个人身份,而在网络世界里,这个组织就是ca组织。
go语言精进之路截图
server.key是网站拥有的自己的私钥,ca.key是ca的私钥,server.crt是网站的数字证书。
1,首先网站服务将自身的一些基本信息通过自身的私钥进行加密,然后将自身的公钥和基本信息密文通过证书签名请求的格式传递给ca。 2,ca得到请求后,利用网站服务的公钥,对其基本信息进行解密。然后再按x509数字证书规范生成公钥证书。
这里涉及到ca对证书信息的加密方式,前面提到用私钥加密的数据,可用公钥解密,当将证书信息通过私钥加密后,客户端就能通过ca的公钥去解密证书,能成功解密,说明证书的确是ca颁发的。
但实际加密却不是这样,因为非对称加密算法 加密的信息越多性能越差,所以是将证书信息通过摘要算法生成固定长度的字符后,再采用ca私钥对其摘要进行加密。 摘要算法(常见的如MD5,sha)确保了数据的完整性,因为多次相同内容的数据用相同摘要算法计算的结果一致,所以能基本保证数据未被篡改。
3,x509数字证书里面包含 以下信息: 服务端公钥(server.pub); 证书相关属性信息,如域名、有效期等; 证书颁发机构的签名信息 4,然后就是客户端的解密过程,拿到证书以后,通过ca公钥对证书以及公钥信息的摘要密文进行解密,得到消息摘要,然后用摘要算法对证书信息以及公钥信息进行摘要计算,将客户端得到的摘要和密文解密后的摘要进行对比,如果相同,说明内容未被篡改,证书有效。
通过私钥加密,公钥解密的方式提供证书的颁发证明,能成功解密说明证书的确是ca颁发的。 通过摘要算法,确保了证书的完整性,未被篡改的证明。
建立在http要解决什么问题的基础上,理解http的握手过程,看看它究竟做了什么设计,让握手过程更高效,更安全。
http是为了解决明文传输的不安全性,以及对端身份认证的问题。
1,客户端发送client hello信息将自身支持的tls版本,密码套件的信息传给服务端。
2,服务端接收后会发送server hello信息 选择tls版本和加密算法发给客户端。
3,然后服务端发送server certificate 信息将自身的证书下发给客户端。
4,然后服务端接着又发送密钥协商请求 server key exchange, 在密钥协商环节,通常会使用到Diffie-Hellman(DH)密钥交换算法,这是一种密钥协商的协议,支持通信双方在不安全的通道上生成对称加密算法所需的共享密钥。注意这种交换算法使用的目的是既让通信双方都拥有一样的密钥,但是呢,密钥又不是通过数据传输到对面的,是协商产生的。
5 接着客户端收到证书后,先检验证书的有效性, 然后客户端生成接下来加密通信的密钥,同时将生成密钥的一些参数 用服务端的公钥加密后 发送给 服务端,这个阶段称为client key exchange阶段,服务端收到后按这些参数后用自身的私钥解密 然后也生成相同密钥。
6,最后客户端和服务端分别会将连接至今的所有报文进行加密发送给对方,以验证tls握手成功。
懂了交互逻辑以后,就知道了,声明一个http服务的时候,得有一个ca颁发的证书,证书里面包含服务端自身的公钥信息和一些基本信息,然后还得指明明服务器的私钥,用于tls握手过程中对密钥协商参数的加解密。
package main
import (
// "fmt"
// "io"
"net/http"
"log"
)
func HelloServer(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/plain")
w.Write([]byte("This is an example server.\n"))
// fmt.Fprintf(w, "This is an example server.\n")
// io.WriteString(w, "This is an example server.\n")
}
func main() {
http.HandleFunc("/hello", HelloServer)
err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
基于上述http原理,下面我将会用openssl 工具以及golang程序来演示下http加解密过程。
openssl genrsa -out server.key 2048
openssl req -new -x509 -key server.key -out server.crt -days 3650
server.crt 就是我们的自签名证书了,然后启动go http服务
package main
import (
"log"
// "fmt"
// "io"
"net/http"
)
func HelloServer(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/plain")
w.Write([]byte("This is an example server.\n"))
// fmt.Fprintf(w, "This is an example server.\n")
// io.WriteString(w, "This is an example server.\n")
}
func main() {
http.HandleFunc("/hello", HelloServer)
err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
(base) ➜ ~ curl http://proxy.example.com:443/hello
curl: (60) SSL certificate problem: self signed certificate
More details here: http://curl.se/docs/sslcerts.html
curl 提示是自签名证书,因为我们使用的openssl 按x509标准生成的证书,不是ca颁发的,所以curl有这个错误。
不同操作系统添加信任的方式不同,我使用的是mac os,在钥匙串应用里将证书添加进来并设置为信任。 注意这里我设置了证书的域名是proxy.example.com ,所以我还需要设置下这个域名对应的ip
vim /etc/hosts
255.255.255.255 broadcasthost
127.0.0.1 localhost
::1 localhost
## 添加上这行
127.0.0.1 proxy.example.com
(base) ➜ ~ curl http://proxy.example.com:443/hello
This is an example server.
发现当前访问已经成功了。
完美收工。。。
参考文献: go 语言精进之路
我们将处理视野中出现多个物体的情况:并且,我们还要开发一些更成熟的方法,用于从二值图中恢复信息。 概述图像处理时,视野中经常会出现多个物体,对于图像中的各个区域,我们必须将它们以某种方式标注出来,然后,分别计算:各个区域的面积、一阶矩和二阶矩。标注图像中的物体特征函数特征函数又被称为示性函数,即:给图像中的不同区域赋予不同的数值,数学上,特征函数可以被表示为:如果x\in\Omega_{i},那么,I(x)=i,其中\Omega_{i}表示:图像中的第i个区域。连通区域如果我们可以找到:连接二值图中的两个点的一条路径,并且,在这条路径上,特征函数的取值是常数,那么,我们认为:这两个点是连通的。因此,在图中点A与点B是连通的,但是,它们都不与点C相连通。二值图中的连通区域是一个:关于连通点的最大的集合,也就是说,对于这个集合中的任意两点,都可以找到一条路径将它们连接起来; 所有的连通点都包含在这个集合之中。 在图中,除了背景以外,总共有4个连通区域和4个洞。标注在离散二值图中,一种对“物体”进行标注的方法是:选取一个b_{ij}=1的点,并且,赋予这个点以及和它连接在一起的点一个标记;下
ECL、PECL、LVPECL是常用的差分信号,本文重点介绍PECL与PECL直流耦合和交流耦合的差别。其余的可以参考原文链接。ECL、PECL、LVPECL使用注意:不同电平不能直接驱动。中间可用交流耦合、电阻网络或专用芯片进行转换。以上三种均为射随输出结构,必须有电阻拉到一个直流偏置电压。1.PECL接口输出结构 PECL电路的输出结构如图所示,包含一个差分对和一对射随器。输出射随器工作在正电源范围内,其电流始终存在,这样有利于提高开关速度。标准的输出负载是接50Ω至VCC-2V的电平上,如图中所示,在这种负载条件下,OUT+与OUT-的静态电平典型值为VCC-1.3V,OUT+与OUT-输出电流为14mA。PECL结构的输出阻抗很低,典型值为4~5Ω,这表明它有很强的驱动能力,但当负载与PECL的输出端之间有一段传输线时,低的阻抗造成的失配将导致信号时域波形的振铃现象。PECL输入结构如图2所示,它是一个具有高输入阻抗的差分对。该差分对共模输入电压需偏置到VCC-1.3V,这样允许的输入信号电平动态最大。MAXIM公司的PECL接口有两种形式的输入结构,一种是在芯片上已加有偏置电
引言:本文的代码与昨天发表的《VBA实战技巧34:使用VBA组织图形1》一样,都整理自mrexcel.com,一个很好的令人兴奋的示例,有兴趣的朋友可以仔细研究。代码所使用的工作表数据与《VBA实战技巧34:使用VBA组织图形1》相同,如下图1所示,包含所需信息的源数据表,其中:列A和列B–两个元素之间的关系。形状填充颜色将来自列A。列C–要显示的描述性文本。列D–放置在形状旁边的辅助数据。列E–形状是否有轮廓。图1 与《VBA实战技巧34:使用VBA组织图形1》不同,本文的代码自顶向下组织图形,代码运行后的效果,如下图2所示。图2注意,SmartArt可以创建组织结构图,但会有格式限制,本文给出的代码克服了这一点。VBA代码如下:Dimh%,w%'主程序Submain()Dimi%,obAsWorksheet,dtAsWorksheet,rAsRange,tbAsShapeSetdt=Sheets("tdata")Setob=Sheets("fshap")h=1w=1Settb=dt.Shapes.AddTextbox(msoText
GeneticCFL聚类联邦学习超参数优化.pdf联邦学习(FL)是一种分布式学习模型深度学习,集成了客户端-服务器架构,边缘计算和实时智能。FL有能力革命性的机器学习(ML),但由于技术限制、通信开销、非IID(独立且相同分布的)数据和隐私问题,在实现方面缺乏实用性。训练一个ML模型在异构的非IID数据上严重降低了收敛性速度和性能。现有的传统和集群FL算法有两个主要的限制,包括效率低下客户培训和静态超参数利用。为了克服针对这些局限性,我们提出了一种新的混合算法,即遗传聚类FL(geneticclusteredFL,geneticCFL),即聚类边缘设备基于训练超参数和遗传以集群方式修改参数。然后,我们介绍了一种算法这大大提高了单个聚类的准确性通过融合基于密度的聚类和遗传超参数优化。结果是使用基准标记MNIST手写数字数据集和CIFAR-10数据集。提出的遗传CFL显示了显著的改进和适用于非IID和不明确数据的实际情况。原文题目:GeneticCFL:OptimizationofHyper-ParametersinClusteredFederatedLearning原文:Abstrac
导读:90后打开体检报告单的心情就像是开奖,字越少越开心。但可惜的是,事与愿违。上海外服联合《大众医学》发布的《2018上海白领健康指数报告》显示,2017年上海白领体检异常比率高达97.08%。换句话说,100位公司人当中只有不到3个是完全健康的。刚刚结束了一年一度的单位体检,笔者深吸一口气,强忍住紧张的心情查看了体检报告。肝脂肪浸润、血压低、贫血、窦性心律,再想想自己平时腰痛、颈椎痛、偏头痛……眼前顿时一黑,越想越觉得自己时日无多,脑海中第10086次有了立遗嘱的冲动。转念一想,反正也没钱,就不浪费社会资源了。算了,还是继续写稿吧。八月底有个热搜就是#90后不敢看体检报告#,这个阅读量达到5.5亿的热词算是说出了所有年轻人的普遍心声。热搜里的一个高赞微博说的是“每次看体检报告都像是看考试成绩,长大才知道成绩算个×,好好活着才是最大的成功。”这无疑就是一个网友拿到报告单后,看着上面的结果发出的嘶吼。 90后佛系生活的背后其实并非完全看淡了生死,而是对自己健康深深的不自信,却又无能为力的感叹。这届90后身体到底有多差?本文将用数据切入,为你揭示现在年轻人的生存现状。01这届年轻人的身体
下载软件,使用命令wgetxxx,参数:url例如:wgethttp://download.redis.io/releases/redis-3.0.0.tar.gz解压缩,使用命令tar,参数:zxvfz(gzip属性的)、x(解压)、v(显示过程)、f(使用档案名称),文件名例如:tarzxvfredis-3.0.0.tar.gz切换到解压目录里,进行安装cdredis-3.0.0make此时就安装完成了,进到目录src里面,启动redisredis-server打开客户端,进行测试,还是src目录,启动客户端redis-cli进入了redis控制面板,使用命令setget测试setnametaoshihangetname运行外网访问,先暂时关闭防火墙或者,或开放防火墙的6379端口关闭防火墙:serviceiptablesstop修改防火墙规则:编辑/etc/sysconfig/iptables文件可以复制其他端口的配置改一下,添加一行-AINPUT-ptcp-mtcp--dport6379-jACCEPTphp测试windows系统下载php扩展文件下载地址:http://win
正文共:2957字6图 预计阅读时间:8分钟每日分享Bethetypeofpersonyouwanttomeet.努力变成理想的模样。小闫笔记:问自己一个问题『如果遇见现在的自己,你会喜欢吗?』对自己好一点,投资自己,你可以活成你想象中的任何模样。1.知识点1.redis中ttl命令可以查看有效期。expire设置有效期。2.redis数据库高效是因为epoll,而epoll是基于Linux,所以redis中最好是在Linux中使用。3.sha1被中国的一位女博士破解了。4.URL地址中%2C是逗号。5.response.urljoin(url):对提取到的url自动补全域名,因为一般提取的url地址是相对路径。6.scrapy_splash是scrapy的一个组件。scrapy-splash加载js数据是基于Splash来实现的。 Splash是一个Javascript渲染服务。它是一个实现了HTTPAPI的轻量级浏览器,Splash是用Python和Lua语言实现的,基于Twisted和QT等模块构建。 使用scrapy-splash最终拿到的response相当于是在浏览器全部渲
版权声明:原创勿转 https://blog.csdn.net/anakinsun/article/details/89011693 思路实现内置的排序接口来进行排序codetypeintSlice[]int funcnewIntSlice(a[]int)intSlice{ b:=intSlice{} for_,v:=rangea{ b=append(b,v) } returnb } func(sintSlice)Len()int{ returnlen(s) } func(sintSlice)Less(i,jint)bool{ stri:=strconv.Itoa(s[i]) strj:=strconv.Itoa(s[j]) s1,_:=strconv.Atoi(stri+strj) s2,_:=strconv.Atoi(strj+stri) returns1>s2 } func(sintSlice)Swap(i,jint){ s[i],s[j]=s[j],s[i] } funclargestNumber(nums[]int)str
花了两天时间研究了下,最终确定写一个关于爬虫教程,名字叫做数据采集从入门到放弃,会寄托在GithubPages上,使用mkdocs创作和管理。 源码:https://github.com/zhangslob/docs在线阅读:https://zhangslob.github.io/docs/内容介绍本书会介绍我目前所知的所有关于爬虫的东西,更像是我的技能清单,仔细把其中所有的内容过一遍,目标是传播知识。大概会分为这么几个大方向:爬虫介绍、就业情况HTTP协议介绍Requests使用解析器Xpath介绍MongoDB与MySQL多线程爬虫Scrapy介绍Scrapy-redis介绍可能还会增加一些别的,主要是看心情。如:简单验证码处理(这个我也在学)IOS逆向Chrome断点调试和加密分析Docker使用Selenium与Appnium、pyppeteer布隆过滤器Charles、mitmproxy抓包全站爬取思路Spark相关其他语言如Go、JAVA爬虫这其中的每一点都需要花很多时间去研究,希望我们一起进步。我不会讲Python基础语法那些,建议去BeginnersGuide和docu
在OracleRAC中,可以从多个层次,多个不同的机制来检测RAC的健康状况,即可以通过心跳机制以及一定的投票算法来隔离故障。如果检测到某节点失败,则存在故障的节点将会被逐出集群以避免故障节点破坏数据。本文主要描述了OracleRAC下的几种心跳机制以及心跳参数的调整。一、OCSSD与CSS OCSSD是一个管理及提供ClusterSynchronizationServices(CSS)服务的Linux或者Unix进程。使用Oracle用户来运行该进程并提供节点成员管理功能,一旦该进程失败,将导致节点重启。CSS服务提供2种心跳机制,一种为网络心跳,一种为磁盘心跳。两种心跳都有最大延时,网络心跳的延时叫MC(Misscount),磁盘心跳延时叫作IOT(I/OTimeout)。这2个参数都以秒为单位,缺省时情况下Misscount<Disktimeout。下面分别描述这2种心跳机制。二、网络心跳 故名思义即是通过私有网络来检测节点的状态。如果私有网络硬件、软件导致集群节点间私有网络在一定时间内无法进行正常通信,由此而导致脑裂。由于集群环境中的存储为共享存储,因此
SDN可谓是一个创新理念,SDN可以帮助自动化和管理WAN操作,原来配置、维护和变更WAN基础设施是一个噩梦,鉴于其分布式的性质以及所有远程接触点,但新兴的软件定义网络(SDN)工具可以让这些操作更加有效。 SDN通常被称为数据中心工具,它可以用来自动化和管理WAN操作,ZK研究公司负责人ZeusKerravala表示,WAN问题很难解决,因为资源的分散性,“并没有完美的方法来对WAN进行更改,但SDN可以从中央位置自动化和编排,让你更快响应。” 对于企业客户来说,WAN是比数据中心网更加头痛的问题,特别是那些受到IT约束的WAN。SaaS、私有云、BYOD、移动性和语音/数据融合等主要IT趋势都增加了额外的WAN压力,WAN链路现在需要更好的安全性、更低的延迟性、更高的可靠性以及支持任何位置的任何设备来适应这些趋势。 Doyle研究公司分析师LeeDoyle表示:“WAN或分支已经足以成熟可通过SDN来中断,SDN供应商正在试图简化分支运营的困境。” 事实上,开放网络用户组(ONUG)创始成员LippisEnterprise公司的NickLippis表示,该组织的成员认为SDNWAN
1.修改 修改vim/etc/pki/tls/openssl.cnf #取消req下被注释的第2行[req]distinguished_name=req_distinguished_namereq_extensions=v3_req #删除req_distinguished_name下的0.xxx的标签,把0.xxx的0.去掉[req_distinguished_name]countryName =CountryName(2lettercode)countryName_default=CNstateOrProvinceName =StateorProvinceName(fullname)stateOrProvinceName_default=ShangHailocalityName
出现这个问题解决如下: 比如问题文件为\workspace\pics5\src\baolintest\test.java文件,则 1.把在工程根\workspace\pics5\src\baolintest目录备份 2.然后删除\workspace\pics5\src\baolintest目录 3.在Eclipse下刷新工程。 4.svnupdatebaolintest目录 5.最后把baolintest目录再覆盖回来。 希望多多交流,多多关注,共同成就梦想
一、MQTT遗嘱 MQTT可以设置遗嘱,客户端在连接Broker的时候将遗嘱内容(也是topic+payload形式,遗嘱也有一个主题)发送给Broker并保存在Broker中,当客户端因为非正常原因断开与Broker的连接时,Broker会将遗嘱信息发送给订阅了该主题(订阅遗嘱的主题)的客户端。 客户端正常调用DISCONNECT断开连接时属于正常断开连接,Broker不会发送遗嘱,而且会将遗嘱从Broker中删除。 遗嘱消息发布的条件,包括但不限于: 服务端检测到了一个I/O错误或者网络故障。 客户端在爆出连接(KeepAlive)的时间内未能通讯。 客户端没有发送DISCONNECT保温直接关闭了网络连接。 由于协议错误服务端关闭了网络连接。 一旦被发布或者服务端收到了客户端发送的DISCONNECT报文,遗嘱消息就必须从存储的会 话状态中移除。 二、基于paho.mqtt.c实现遗嘱功能 网上关于遗嘱的介绍不少,但是实际的例子却很少,按理说paho.mqtt.c这个库用的挺多的,但是也没找到相关的例子,自己写了一个,其实也挺简单的,代码如下: //mqtt-last-wil
三种方式 1.使用容器连接的示例如下: $dockerrun--namesome-app--linkitbilu-mysql:mysql-dapplication-that-uses-mysql复制 注意:以上示例中的application-that-uses-镜像并不存在,仅为操作演示,下同。 除了进行容器连接的方式在其它容器中访问MySQL服务器容器外,还可以通过以下两种方式访问MySQL数据库服务器容器: 2.在创建MySQL服务器容器实例时通过-p或-P参数将数据库服务器端口映射到宿主机,再直接通过宿主机进行访问。这种方式较为简单,但需要向外暴露数据库端口。 3.能过Docker网络(Networking)进行连接。这种方式操作较为复杂,但更为灵活,可以适用于更加复杂的网络环境。 1.9版本之前推荐用--link1.9版本之后推荐用dockeringnetwork 创建自己的容器: 建个目录,写个Dockerfile FROMnimmis/apache MAINTAINERnimmis<kjell.havneskold@gmail.com> #
「JOISC2020Day4」首都城市 进行点分治,考虑最终的连通块是否经过当前分治中心,若经过,则当前分治中心的颜色必选,否则分治递归处理。 若一个颜色必选,当前连通块中所有为该颜色的点都要选,一个点被选同时也意味着其到当前分治中心路径上的点也都要选,不断迭代得到当前分治中心的答案即可。 还有另一种做法:若颜色\(i\)形成的虚树上有颜色为\(j\)的点,则\(i\)向\(j\)连边,意思为选了\(i\)则必选\(j\)。对所有缩点后出度为\(0\)的点取\(siz-1\)的最小值即为答案。可以用树剖线段树来优化建图。 「JOISC2019Day2」两个天线 只用考虑\(i<j,h_i>h_j\)的情况,另一种情况取反后再做一遍即可。考虑扫描线,每个位置\(i\)维护其对应的\(h_i-h_j\)的最大值。 \(i\)往后起作用的区间为\([i+a_i,i+b_i]\),将其在相应的位置加入删除即可,加入就是将维护的第一项赋值为\(h_i\),删除就是将其赋值为\(-\infty\)。 \(j\)往前起作用的区间为\([j-b_j,j-a_j]\),将这段区间的第二项和\
原题链接 题目描述:约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有K(O≤K<N)只牝牛.请计算一共有多少种排队的方法.所有牡牛可以看成是相同的,所有牝牛也一样.答案对5000011取模。 输入格式:一行,输入两个整数N和K. 输出格式:一个整数,表示排队的方法数. 输入样例: 42 输出样例: 6 解析:一道比较简单的题,直接组合数算一下即可。 代码如下: #include<cstdio> usingnamespacestd; constintMOD=5000011; intn,k,fac[100005],ans; intksm(intx,inty){ intres=1,base=x; while(y>0){ if(y&1)res=1ll*res*base%MOD; base=1ll*base*base%MOD; y>>=1; } returnres; } intC(inta,in
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="en"lang="en"> <head> <metahttp-equiv="Content-Type"content="text/html;charset=ISO-8859-1"/> <title>CSSHouse(3DBorderDemo2)byChrisHester</title> <styletype="text/css"> /*ThankstoBigJohnforrepeatedtestinginIE5/Win!*/ /*http://positioniseverything.net*/ *{ font-family:Verdana,Arial,Helvetica,sa
并发和并行|Python中实现多线程threading和多进程multiprocessing 昨天晚上组会轮到我汇报技术内容,最近正在和ray以及spark打交道,索性讲一下并发和并行。反正大家都是管理学院的,平时很少接触这种,因此这个选题不大可能因为内容基础而贻笑大方。 本文摆一摆并发和并行。附上很简单的Python代码,涉及到自带库threading和multiprocessing的使用。 并发和并行 咱们简单用多线程对应并发,多进程对应并行。多线程并发更强调充分利用性能;多进程并行更强调提升性能上限。 我用非常简单且不那么严谨的比喻来说明。 多线程 一个CPU相当于一个学生。 一个学生一周开一次组会,换句话说一周给老师汇报一次工作。 老师一般会给学生同时布置几个任务,比如做比赛、做项目、读论文,学生可能周一做做比赛、周二读读论文、周三做做项目...到了组会,他就把三件事都拿出来汇报,老师很欣慰,因为在老师的视角里:学生这三件事是同时在做的。 多线程也是同一个道理,假设你的手机只有一块单核CPU。你的CPU这0.01秒用来播放音乐,下0.01秒用来解析网页...在你的视角里:播放音
Description:Givenanarrayofnon-negativeintegersnums,youareinitiallypositionedatthefirstindexofthearray. Eachelementinthearrayrepresentsyourmaximumjumplengthatthatposition. Yourgoalistoreachthelastindexintheminimumnumberofjumps. Youcanassumethatyoucanalwaysreachthelastindex. Link:45.JumpGameII Examples: Example1: Input:nums=[2,3,1,1,4] Output:2 Explanation:Theminimumnumberofjumpstoreachthelastindexis2.Jump1stepfromindex0to1,then3stepstothelastindex. Example2: Input:nums=[2,3,0,1,4] Output:2 Exa