大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
之前的文章httprouter路由框架为什么高性能提到过一点高性能的原因就是它减少了内存分配。因为分配内存是在堆上分配的,调用mallocgc函数,是有性能消耗的。
创新互联于2013年成立,先为珙县等服务建站,珙县等地企业,进行企业商务咨询服务。为珙县企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
而httprouter中使用sync.pool来减少内存分配,减少GC消耗。
那么sync.Pool为什么能做到这一点?做出来哪些减少性能消耗的工作?
sync.Pool是一组可以单独保存和检索的临时对象。存储在Pool中的任意对象可能会自动删除,这个删除过程是不会通知到用户的。
Pool的目的是缓存已分配但没有使用的对象以供之后复用,减轻垃圾回收的压力。而Pool是并发安全的,也就是说,它可以轻松构建高效、线程安全的存储池。
一个例子就是在fmt包中,Pool维护了一个动态大小的临时输出缓冲区存储,存储在负载的时候扩展(多goroutine打印),在静止时缩小。
然后当使用时申请对象,Get方法会返回Pool已经存在的对象,如果没有,就走New方法来初始化一个对象。
当使用完成后,调用Put方法把对象放回Pool中。
Pool就3个接口,针对所有的对象类型都可以使用。
那么我们来思考一个问题,使用sync.Pool有什么好处?
下面我们来看一个例子
最终打印结果
多次运行可能会出现不同的结果,但是次数count都不大。如果不是使用Pool来申请,而是直接使用buffer := make([]byte, 1024)来申请内存,那么就会申请 1024 * 1024 个对象,造成极大的浪费。而Pool就是对这类对象的复用。
既然已经知道了复用对象的好处,那么sync.Pool到底是如何实现这一功能的呢?
首先我们来看看Pool的结构
poolLocal管理Pool池里的cache元素的关键结构
这个pin函数hold住了当前goroutine在P上,不允许调度,并且返回P的本地pool和P的id。
这个indexLocal其实就是个索引到本地pool的指针
通常只有第一次执行的时候,p.localSize为0,才会执行p.pinSlow,其他都直接走if返回本地pool了。
pinSlow就是把Pool注册进allPools数组中
首先先解锁,然后加全局互斥锁
allPools就是全局的pool,oldPool就是victim使用的pool。
然后再重新hold住goroutine在P上,二次判断是否直接返回本地pool。
而使用runtime.GOMAXPROCS(0)来获取cpu的数量,也就是P的数量。
这里深入扩展一下,runtime_procPin其实是runtime包下的procPin的一层封装。
procPin的目的就是为了当前G被抢占了执行权限,也就是说G在M上不走了,而实际核心是mp.locks++,在newstack函数里,有这么段代码
这里mp.locks0,所以就只能让G一直执行
而runtime_procUnpin函数可以猜想的到,就是让mp.lock--。
从private中取出对象,如果取出的对象为nil,那么就尝试从share队列中获取,如果还是nil,就从其他P的队列中取,或者从victim中取。
如果上面几个地方都不存在该对象,那么就调用New函数初始化一个对象返回
看到这里,可能就有点疑惑了,Pool就这两个方法,也没有用到victim。
这个奥秘就在于它注册了init函数,在每次GC的时候调用poolCleanup函数,也就是说每一轮GC都会对所有的Pool做清理工作。
而poolCleanup函数就是做pool的迁移
1、sync.Pool是并发安全的,读取数据时会hold住当前的goroutine不被打断
2、sync.Pool不允许复制后使用,因为nocopy
3、sync.Pool不适用于socket长连接或连接池等,因为无法知道连接池的个数,连接池的元素随时可能会被释放。
4、从sync.Pool取出的对象使用完需要放回池中。
PIN是电信名词,是指SIM卡的个人识别密码,手机在使用SIM卡的时候,PIN码是比较常见的。
_艿睦此担_IN码就是手机卡的密码,只要手机设置了PIN码,无论是关机重启,还是插拔手机卡,都要输入PIN码才可以使用手机卡打电话上网,所以它能很好的防止他人将你的手机卡插入自己手机中使用,利用手机验证码修改你的微信支付宝密码,盗取你的个人财产。
在python的交互式界面,你输入一句代码敲回车,这一句就会开始执行。
有些代码执行马上就完成了,有些则不然,例如这个input,等待用户的输入,所以你一定要输入点什么东西,哪怕直接敲回车,不敲这一下,是没法敲第二句代码的。
如果想把代码都敲完了一起执行,那不能使用交互式界面,需要使用编辑器把所有的代码都输入完毕,再执行。
程序并没有语法错误
但是存在逻辑错误,pin变量应该是int类型
然而input输入得到的是str类型,需要转换成int类型
将那一行改成如下即可
pin = int(input('pin: '))
楼主对于os.system方法理解有误,不是你PING不通才返回的0,
os.system只是帮你执行命令而已,如果这个命令是有效的他返回0,如果无效则返回1,你可以试试os.system('abc')他是返回1的(因为abc这个命令是无效的),对于你的PING命令来说,只要他能成功执行无论PING通不PING通他都会返回0.
你要测试网络是否通不能采用这种方式,应该使用PYTHON自带的库。