首页 > 其他分享 >sync.Pool

sync.Pool

时间:2023-10-07 17:12:44浏览次数:30  
标签:poolChain buffer sync 一个 ring Pool

sync.Pool会先查看自己是否有资源,有则直接返回,没有则创建一个新的,在GC的时候释放缓存的资源   使用sync.Pool是为了复用内存,减少内存分配,减轻GC压力,减少CPU资源   实现类似功能的Pool最简单的方案就是用队列,而且是并发安全的队列。 队头取,队尾放回去、在队列为空的时候创建一个新的 或者用channel也能实现一个类似的Pool   但是并发安全依赖于锁,全局锁会成为性能瓶颈 Go采取了窃取的方案来突破瓶颈   GO的设计: 每个Pool一个PoolLocal对象 每个PoolLocal有一个private 和 shared shared指向的是一个poolChain。poolChain 的数据会被别的 Pool 给偷走
poolChain 是一个链表 + ring buffer 的双重结构
从整体上来说,它是一个双向链表
从单个节点来说,它指向了一个 ring buffer。后一个节点的 ring buffer 都是前一个节点的两倍
ring buffer 优势(实际上也可以说是数组的优势):
一次性分配好内存,循环利用
对缓存友好

 GET的步骤

1 看看 private 可不可用,可用就直接返回
2 不可用则从自己的 poolChain 里面尝试获取一个
3 从头开始找。注意,头指向的其实是最近创建的 ring buffer,从队头往队尾找
4 找不到则尝试从别的 Pool 里面偷一个出来。偷的过程就是全局并发,因为理论上来说,其它 Pool 都可能恰好一起来偷了,偷是从队尾偷的
5 如果偷也偷不到,那么就会去找victim的
6 连victim的也没有,那就去创建一个新的

标签:poolChain,buffer,sync,一个,ring,Pool
From: https://www.cnblogs.com/mengqi-go/p/17746761.html

相关文章

  • 使用rsync+inotify实现/www目录实时同步
     #rsync常用于做为linux系统下的数据镜像备份工具,实现远程同步,支持本地复制,或者与其他SSH、rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时数据同步官方网站:http://rsync.samba.org/软件包:rsync,rsy......
  • rsync 远程同步
    一、rsync远程同步简介rsync(RemoteSync,远程同步)是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。在远程同步任务中,负责发起rsync同步操作的客户机......
  • .net List.ForEach内部Async/Await 异步的问题
    在开发异步的WebApi时,发现一个线程并发错误,起初以为SqlSugar问题。后来,经查是代码写的问题。但此问题,不遇到,不会知晓,只有异步才会出现此问题。这种问题,也发生在JavaScript下,代码逻辑是一样的。参看这篇:https://advancedweb.hu/how-to-use-async-functions-with-array-foreach-in-......
  • 2023-10-06 useState数据渲染不同步==》async await
    业务:点击按钮增加数据并渲染出来。框架:antd+ts+react。原来写法:const[tagData,setTagData]=useState<Array<number>>([]);点击事件://添加标签constaddTag=()=>{letarr:(number)[]=[];arr=tagData;arr.push(Math.floor(Math.random()......
  • Rsync 远程同步
    目录1.配置rsync源服务器1.1191.168.175.1081.2191.168.175.1092.发起端配置rsync+inotify192.168.175.108配置rsync源服务器192.168.175.109配置rsync源服务器192.168.175.110发起端配置rsync+inotify1.配置rsync源服务器1.1191.168.175.108vim/etc/......
  • rsync远程同步
    rsync远程同步nfs不太安全、scp是全量复制rsync是快速增量备份工具remotesync,远程同步官网:http://rsync,samba.org下行同步:(推)服务端发出命令,源地址是服务端,目的地址是客户端(从源服务器拉数据)上行同步:(拉)客户端发出命令,源地址是客户端,目的地址是服务端(推数据到源服务器)定时......
  • 使用 expo-location 获取不到位置信息 Location.getCurrentPositionAsync() 结果无打
    问题描述:reactnative中使用expo-location获取位置信息时,按照官方文档执行案例,获取不到位置结果。Location.requestForegroundPermissionsAsync()执行后可以获取授权状态,但是执行到Location.getCurrentPositionAsync()时不会打印结果。解决方法:给Location.getCurrentPos......
  • 关于Async、Await的一些知识点
    在ASP.NETCore中,当一个HTTP请求到达服务器时,它会被分配给线程池中的一个线程来处理。该线程会执行相应的Controller方法。如果这个方法是一个异步方法并且使用了await关键字,那么在await的代码执行完毕之前,这个线程会被释放回线程池,可以用来处理其他的HTTP请求。当await的代码执......
  • [Compose] Asynchronous Reactive Data with Promises
    Let’smakeusingtheobserversasynchronous!Thiswaywecanupdatethedataandhavemultipleobserversrunasynchronously.classAsyncData{constructor(initialData){this.data=initialData;this.subscribers=[];}//Subscribetochan......
  • [题解] CF632F - Swimmers in the Pool
    CF632F-SwimmersinthePool题目传送门题意给定一个大小为\(n\timesn\)的矩阵\(A\)。假设\(A\)满足以下条件,那么称该矩阵为MAGIC,否则为NOTMAGIC,并输出对应的属性(即\(A\)是MAGIC还是NOTMAGIC)。$A_{i,j}=A_{j,i}$;$A_{i,i}=0$;$A_{i,j}\le......