go语言一个大的语言特色就是goroutine协程,而和很多同事沟通的时候,他们都认为goroutine很快,今天我们就来看一看goroutine是如何运行的。MPG模型go使用的是MPG模型,意思是通过一个全局的调度器来实现goroutine协程的调度,来达到通过分配平均使用CPU资源。go的调度器有3个重要的结构,M(OS线程)、P(协程调度器),G(goroutine协程)M(OS线程):是操作系统的线程,一个程序可以模拟出多个线程。P(逻辑处理器or协程调度器):这个一个专门调度goroutine协程的逻辑处理器,或者称为协程调度器都可以。G(goroutine协程):goroutine协程。用户空间线程和内核空间线程之间的映射关系有:N:1、1:1和M:NN:1,多个(N)用户线程始终在一个内核线程上跑,context上下文切换确实很快,但是无法真正的利用多核。1:1,一个用户线程就只在一个内核线程上跑,这时可以利用多核,但是上下文switch很慢。M:N,多个goroutine在多个内核线程上跑,这个看似可以集齐上面两者的优势,但是无疑增加了调度的难度。而go使用的就是M:
转:https://www.cnblogs.com/hanshuai/p/14927181.html我们在使用高德地图js api开发时,会用到Marker类在地图上来显示一个地点的位置。如果我们使用默认设置或者设置出错的时候:比如一个点在一条河的左边,当地图级别不停缩小的时候,这个点会慢慢的显示在河的右边,地图级别放大的过程中相反。这块的问题其实跟 anchor 和 offset 有关系:默认值achor: 'top-left'offset: new AMap.Pixel(-10,-34)截图示例地址仔细上图中红框中的marker表示:红色为默认原点为'top-left'(achor的默认值),蓝色的方框为Icon(官网demo中icon尺寸为20*34),需要将Icon的下边的尖儿移到achor(0,0)的位置,Icon需要向右移动10,向上移动34,所以offset默认为 new AMap.Pixel(-10,-34),解释请看下图:解决方法1:achor使用api默认值('top-left')如果icon大小为(10, 20),我们需要设置offset的值为 new AMap.
Redis7学习的提前准备拥有linux环境 版本为centos7(7.0以上8以下皆可,本人采用阿里云服务器)有linux基础,会基本使用本笔记根据尚硅谷阳哥的b站redis7课程边学边写(感谢尚硅谷,感谢阳哥)保证linux有正常的网络环境B站课程视频地址1 初识redis(该段建议背诵)Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:它基于内存,运行效率高它支持分布式,理论上可以无限扩展它以K V键值对的形式存储信息它支持持久化它包含多种数据类型它处理并发读写极为优秀我们一般把它放在mysql前面帮我们处理一些并发量大的查询操作为什么选择学习Redis7而非Redis6?因为redis6被爆出有非常严重的安全bug,redis紧急发布了redis7,redis7中修复了该漏洞!2 Redis 的下载与安装下载redis所有版本的官方下载地址,我采用redis-7.0.0.tar.gz安装本人不推荐使用xftp以及他们家的任何产品,该产品可能利用后门上传你
for循环在我们日常编码中可能用的很多。在很多业务场景中我们都需要用for循环处理。但golang中的for循环有一个大大大的坑,大家可否遇到。直接上代码:我们写一个测试类,定义一个切片数组,然后循环迭代每个元素,将元素的值放到另一个切片。循环finalArrays的时候按照我们的预期应该输出1、2、3、4。但事与愿违,输出的结果如下图:懵逼了吧!为什么会出现这种奇怪的现象呢?这就是golang的循环变量的作用域导致的。在golang的for循环中,循环内部创建的函数变量都是共享同一块内存地址,for循环总是使用同一块内存去接收循环中的的value变量的值。不管循环多少次,value的内存地址都是相同的。事实确实如此,我们输出value的内存地址看下:所以,可以看到,整个4次循环过程中,所有变量值都是在0xc0000b8780这个内存地址上进行迭代的。4次循环都指向的是同一块内存地址,最后一次赋值的操作变量的值是4,指向了这块内存地址,所以前三次的值都变成了4。那我们怎么优化呢?我们只需要定义临时变量。我们定义一个临时变量tmp,将value的值赋给tmp,问题就解决了。总结:①、fo
Xinbo