golang

golang中并发sync和channel

我只是一个虾纸丫 提交于 2019-12-05 01:53:32
golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"go”,但是如何处理go并发机制中不同goroutine之间的同步与通信,golang 中提供了sync包和channel机制来解决这一问题. sync 包提供了互斥锁这类的基本的同步原语.除 Once 和 WaitGroup 之外的类型大多用于底层库的例程。更高级的同步操作通过信道与通信进行。 type Cond func NewCond(l Locker) *Cond func (c *Cond) Broadcast() func (c *Cond) Signal() func (c *Cond) Wait() type Locker type Mutex func (m *Mutex) Lock() func (m *Mutex) Unlock() type Once func (o *Once) Do(f func ()) type Pool func (p *Pool) Get() interface {} func (p *Pool) Put(x interface {}) type RWMutex func (rw *RWMutex) Lock() func (rw *RWMutex) RLock() func (rw *RWMutex) RLocker() Locker func (rw

golang操作RabbitMQ--话题模式

你说的曾经没有我的故事 提交于 2019-12-05 01:53:13
创建连接及RabbitMQ结构体实例代码见 https://www.cnblogs.com/prince5460/p/11895844.html 1.创建话题模式RabbitMQ实例 func NewRabbitMQTopic(exchangeName, routingKey string) *RabbitMQ { //创建RabbitMQ实例 rabbitmq := NewRabbitMQ("", exchangeName, routingKey) var err error //获取connection rabbitmq.conn, err = amqp.Dial(rabbitmq.Mqurl) rabbitmq.failOnErr(err, "Failed to connect rabbitmq!") //获取channel rabbitmq.channel, err = rabbitmq.conn.Channel() rabbitmq.failOnErr(err, "Failed to open a channel!") return rabbitmq } 2.话题模式发送消息 func (r *RabbitMQ) PublishTopic(message string) { //1.尝试创建交换机 err := r.channel.ExchangeDeclare( r

golang同步之sync包

◇◆丶佛笑我妖孽 提交于 2019-12-05 01:52:50
golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"go",但是如何处理go并发机制中不同goroutine之间的同步与通信,golang 中提供了sync包来解决相关的问题,当然还有其他的方式比如channel,原子操作atomic等等,这里先介绍sync包的用法。 sync 包提供了互斥锁这类的基本的同步原语.除 Once 和 WaitGroup 之外的类型大多用于底层库的例程。更高级的同步操作通过信道与通信进行。 type Cond func NewCond(l Locker) *Cond func (c *Cond) Broadcast() func (c *Cond) Signal() func (c *Cond) Wait() type Locker type Mutex func (m *Mutex) Lock() func (m *Mutex) Unlock() type Once func (o *Once) Do(f func()) type Pool func (p *Pool) Get() interface{} func (p *Pool) Put(x interface{}) type RWMutex func (rw *RWMutex) Lock() 写锁 func (rw *RWMutex) RLock() 读锁 func (rw

【Go】Golang Sync包总结

痞子三分冷 提交于 2019-12-05 01:52:26
一. 前言 Golang sync包提供了基础的异步操作方法,包括互斥锁Mutex,执行一次Once和并发等待组WaitGroup。 本文主要介绍sync包提供的这些功能的基本使用方法。 Mutex: 互斥锁 RWMutex:读写锁 WaitGroup:并发等待组 Once:执行一次 Cond:信号量 Pool:临时对象池 Map:自带锁的map 全部: https://blog.csdn.net/chenguolinblog/article/details/90691127 来源: CSDN 作者: dengbiao1212 链接: https://blog.csdn.net/deng624796905/article/details/95318787

golang有用的库及工具 之 sync.Pool改造

♀尐吖头ヾ 提交于 2019-12-05 01:51:55
一个sync.Pool对象就是一组临时对象的集合。Pool是协程安全的。 Pool用于存储那些被分配了但是没有被使用,而未来可能会使用的值,以减小垃圾回收的压力。 如下是使用的两种方式: 一: func main () { for index := 0 ; index < 100 ; index++ { go sss () //go ssse() } time. Sleep ( 2 * time. Second ) } var sp = &sync.Pool{} func sss () { sin := sp. Get () var buf *bytes.Buffer if sin != nil { buf = sin.(*bytes.Buffer) } else { buf = bytes. NewBuffer ( make ([] byte , 0 , 65536 )) } buf. Write ([] byte ( "hello world" )) fmt. Println (buf. String ()) buf. Reset () sp. Put (buf) } 二: package collection import ( "bytes" "sync" ) type BufferPool struct { sync.Pool } func NewBufferPool

golang操作RabbitMQ--Simple模式与Work模式

梦想的初衷 提交于 2019-12-05 01:51:35
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。RabbitMQ是MQ的一种。RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。 1.创建RabbitMQ实例 package RabbitMQ import ( "fmt" "github.com/streadway/amqp" "log" ) const MQURL = "amqp://testuser:123456@127.0.0.1:5672/my_vhost" type RabbitMQ struct { conn *amqp.Connection channel *amqp.Channel //队列名称 QueueName string //交换机 Exchange string //key key string //连接信息 Mqurl string } //创建RabbitMQ结构体实例 func NewRabbitMQ(queueName, exchange, key string) *RabbitMQ { rabbitmq := &RabbitMQ{QueueName: queueName, Exchange:

golang sync.Pool 使用和源码分析

狂风中的少年 提交于 2019-12-05 01:51:02
开发十年,就只剩下这套Java开发体系了 >>> golang 在写高频服务的时候,如何解决gc问题,对象池是一个很有效果的方式,本文阐述下对象池的两种使用方式,和对对象池的源码分析,以及使用pool 的要点。golang 的对象池源码在避免锁竞争还利用了分段锁的思想减少锁的竞争,代码比较精彩。 该文章后续仍在不断的更新修改中, 请移步到原文地址 http://www.dmwan.cc/?p=152 首先sync.Pool 有两种使用方式,使用效果没有区别。 第一种,实例化的时候,实现New 函数即可: package main import( "fmt" "sync" ) func main() { p := &sync.Pool{ New: func() interface{} { return 0 }, } a := p.Get().(int) p.Put(1) b := p.Get().(int) fmt.Println(a, b) } 第二种,get 取值的时候,判断是否为nil 即可。 package main import( "fmt" "sync" ) func main() { p := &sync.Pool{} a := p.Get() if a == nil { a = func() interface{} { return 0 } } p.Put(1) b

golang 各种排序大比拼

ⅰ亾dé卋堺 提交于 2019-12-05 01:49:58
1、准备工作 准备数据: 生成随机数并写入文件,之后在把数据读取出来 //新生成整数随机数,并存储在txt文件中, func NewIntRandm(fileName string , number, maxrandm int ) { filename := fileName file, err := os.Create(filename) if err != nil { return } r := rand.New(rand.NewSource(time.Now().UnixNano())) rans := make ([] string , 0 , number) for i := 0 ; i < number; i++ { rans = append (rans, strconv.Itoa(r.Intn(maxrandm))) } file.WriteString(strings.Join(rans, " " )) defer file.Close() } //把一串数组存入文件总 func SavaRandmInt(fileName string , data [] int ) { if fileName == " " || len (data) == 0 { return } var file *os.File var openerr error file,

golang中strings包用法

妖精的绣舞 提交于 2019-12-05 01:49:24
本文转自Golove博客:http://www.cnblogs.com/golove/p/3236300.html strings 包中的函数和方法 // strings.go ------------------------------------------------------------ // Count 计算字符串 sep 在 s 中的非重叠个数 // 如果 sep 为空字符串,则返回 s 中的字符(非字节)个数 + 1 // 使用 Rabin-Karp 算法实现 func Count(s, sep string) int func main() { s := "Hello,世界!!!!!" n := strings.Count(s, "!") fmt.Println(n) // 5 n = strings.Count(s, "!!") fmt.Println(n) // 2 } ------------------------------------------------------------ // Contains 判断字符串 s 中是否包含子串 substr // 如果 substr 为空,则返回 true func Contains(s, substr string) bool func main() { s := "Hello,世界!!!!!" b :=

golang中sort包实现与应用

流过昼夜 提交于 2019-12-05 01:49:12
1、简介 sort包中实现了3种基本的排序算法:插入排序.快排和堆排序.和其他语言中一样,这三种方式都是不公开的,他们只在sort包内部使用.所以用户在使用sort包进行排序时无需考虑使用那种排序方式,sort.Interface定义的三个方法:获取数据集合长度的Len()方法、比较两个元素大小的Less()方法和交换两个元素位置的Swap()方法,就可以顺利对数据集合进行排序。sort包会根据实际数据自动选择高效的排序算法。 type Interface interface { // 返回要排序的数据长度 Len() int //比较下标为i和j对应的数据大小,可自己控制升序和降序 Less(i, j int ) bool // 交换下标为i,j对应的数据 Swap(i, j int ) } 任何实现了 sort.Interface 的类型(一般为集合),均可使用该包中的方法进行排序。这些方法要求集合内列出元素的索引为整数。 这里我直接用源码来讲解实现: 1、源码中的例子: type Person struct { Name string Age int } type ByAge []Person //实现了sort接口中的三个方法,则可以使用排序方法了 func (a ByAge) Len() int { return len (a) } func (a ByAge) Swap