Go语言中使用 buffered channel 实现线程安全的 pool_Golang

概述

我们已经知道 Go 语言提供了 sync.Pool,但是做的不怎么好,所以有必要自己来实现一个 pool。

给我看代码:

复制代码 代码如下:

type Pool struct {
  pool chan *Client
}

// 创建一个新的 pool
func NewPool(max int) *Pool {
  return &Pool{
    pool: make(chan *Client, max),
  }
}

// 从 pool 里借一个 Client
func (p *Pool) Borrow() *Client {
  var cl *Client
  select {
  case cl = <-p.pool:
  default:
    cl = newClient()
  }
  return cl
}

// 还回去
func (p *Pool) Return(cl *Client) {
  select {
  case p.pool <- cl:
  default:
    // let it go, let it go...
  }
}

总结

现在不要使用 sync.Pool

时间: 2024-08-02 18:38:36

Go语言中使用 buffered channel 实现线程安全的 pool_Golang的相关文章

java语言中线程知识点的意义和作用!

问题描述 java语言中线程知识点的意义和作用! 请问在java的学习中,线程有什么意义?老师说线程可以提高运算速度,但是线程不是同时执行多个程序呢?怎么反倒可以提高性能呢? 解决方案 因为现在的计算机有不止一个cpu(内核),多个线程可以同时使用多个cpu同时计算,同时,多线程还可以在网络.io阻塞的时候做别的事情,提高效率,所以提高了性能.

如何在c语言中控制时间啊,

问题描述 如何在c语言中控制时间啊, 例如,在运行时需要输入,如果过了时间,就不允许输入,该怎么弄,求大神帮忙 解决方案 这个问题可以用双线程也可以用双进程. 假设用双进程, 父进程计时间,到时间了就向子进程发送信号. 子进程收到进程不管scanf(当然或者其他输入数据的函数也可)是否收到数据 子进程一律终止. 事例代码如下: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <

c语言中内存的分配与释放的例子

首先我们来科普一下: 什么是堆?说到堆,又忍不住说到了栈!什么是 栈? 1.什么是堆:堆是大家共有的空间,分全局堆和局部堆.全局堆就是所有没有分配的空间,局部堆就是用户分配的空间.堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏. 2.什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的.栈在线程开始的时候初始化,每个线程的栈互相独立.每个函数都有自己的栈,栈被用来在函数之间传递参数.操作系统在切换线程的时候会自动的切换

了解Java语言中的并发性和Scala提供的附加选项

本文是一个有关 JVM 并发性的新系列第一篇,将介绍 Java 7 中最新的并发性编程功能,还将介绍一些 Scala 增强.本文还为帮助您理解 Java 8 中的并发性特性扫清了障碍. 处理器速度数十年来一直持续快速发展,并在世纪交替之际走到了终点.从那时起,处理器制造商更多地是通过增加核心来提高芯片性能,而不再通过增加时钟速率来提高芯片性能.多核系统现在成为了从手机到企业服务器等所有设备的标准,而这种趋势可能继续并有所加速.开发人员越来越需要在他们的应用程序代码中支持多个核心,这样才能满足性能

C语言中关键字auto、static、register、const、volatile、extern的作用

原文:C语言中关键字auto.static.register.const.volatile.extern的作用 关键字auto.static.register.const.volatile.extern 这些关键词都是c++基础知识,我整理了一下,希望对新学的朋友们有用: (1)auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多写,因为所有的变量默认就是auto的. (2)reg

c++11-C语言中的蜂鸣问题????

问题描述 C语言中的蜂鸣问题???? #include int main() { int n; int b=20; for(n=0;n<21;n++) { printf("aa"); printf("%d",b-n); } getchar(); return 0; } 书上说a这个字符可以使电脑发出声音,试了下果然,大约是是1秒钟滴2下,然后我就编了个类似于倒计时的小程序,但发现这根本行不通,数字刷一下出来完了,声音还是一下一下响(估计这个响的声音与输出bel

Go语言中的复合类型详细介绍_Golang

golang复合类型包括:结构体.数组.切片.Maps. 1.数组 数组 golang中的数组与C语言中的数组差异很大,倒更类似Pascal中的数组. (Slice,下个话题,有些像C语言中的数组) 复制代码 代码如下: var ar [3]int 声明ar为一个拥有三个整型数的数组,所有元素初始化为0. 大小是类型的一个组成部分. 内置的函数len可以用于获取数组大小: 复制代码 代码如下: len(ar) = 3 数组是值类型 golang中的数组是值,而非C语言中的隐式指针.你可以获得数组

.Net“.NET研究”语言中关于AOP 的实现详解

文章主要和大家讲解开发应用系统时在.Net语言中关于AOP 的实现.LogAspect完成的功能主要是将Advice与业务对象的方法建立映射,并将其添加到Advice集合中.由于我们在AOP实现中,利用了xml配置文件来配置PointCut,因此对于所有Aspect而言,这些操作都是相同的,只要定义了正确的配置文件,将其读入即可.对于Aspect的SyncProcessMessage(),由于拦截和织入的方法是一样的,不同的只是Advice的逻辑而已,因此在所有Aspect的公共基类中已经提供了

一起谈.NET技术,.Net语言中关于AOP 的实现详解

文章主要和大家讲解开发应用系统时在.Net语言中关于AOP 的实现.LogAspect完成的功能主要是将Advice与业务对象的方法建立映射,并将其添加到Advice集合中.由于我们在AOP实现中,利用了xml配置文件来配置PointCut,因此对于所有Aspect而言,这些操作都是相同的,只要定义了正确的配置文件,将其读入即可.对于Aspect的SyncProcessMessage(),由于拦截和织入的方法是一样的,不同的只是Advice的逻辑而已,因此在所有Aspect的公共基类中已经提供了