美文网首页
Go 并发常见讨论

Go 并发常见讨论

作者: qingshuiting | 来源:发表于2019-02-20 10:00 被阅读0次

Go 并发常见讨论

并发

chan

Done 控制结束

在service开发的过程中,会有多个异步的线程同时运行,但是有时候希望对应的服务能够停止。一般都会使用close(done)的操作

selct:
 case
 
 case  <- done:
 break or return

有时候这些内容会经常配合waitgroup来使用。

缓存 chan

缓存的chan主要是用来多个线程之间的任务或者数据队列

timer chan

Lock 与 condition

Lock的使用非常简单,在多线程应用中,进行并发控制。

condition的主要使用就是

Wait()

Signal()

Broadcast()

waitGroup

wg的主要使用就是为了控制多个子线程运行的过程中,子线程退出以后才可以退出。

混合使用案例

问题描述:开始的时候需要完成N个tasks,其中每一个task的id是固定的。但是做task的worker是未知的,每次提交一个task的时候就需要一个独占的worker,执行完任务以后就又需要把worker还回去。实现一个这样的模型来完成功能(只有所有任务都正确的结束才能够退出function)

需求描述

  1. 任务数目固定

  2. 如果可用worker较多,尽可能的并发提交任务(因为worker类似于一个资源队列,每次都需要从队列中取出来一个元素)

  3. 并发提交任务(任务成功,返回资源;任务失败进行重做);为了考虑到所有异步task全部处理结束以后,才可以退出整个方法。go中需要使用waitGroup,java中需要使用countDown

code 实现需求

chan 与 buffer混合

有些资源需要使用和释放,所以使用一个buffer chan的操作会好一点。

使用的时候从buffer chan中获取,使用完以后放入buffer chan中。如果buffer 没有或者满了就new一个新的。

// 初始化一个buffer大小的chan list
var freeList = make(chan *Buffer, 100)
var serverChan = make(chan *Buffer)

func client() {
    for {
        var b *Buffer
        // Grab a buffer if available; allocate if not.
        select {
        // 使用时候从buffer list中拿去,如果没有就default
        case b = <-freeList:
            // Got one; nothing more to do.
        default:
            // None free, so allocate a new one.
            b = new(Buffer)
        }
        load(b)              // Read next message from the net.
        serverChan <- b      // Send to server.
    }
}
func server() {
    for {
        b := <-serverChan    // Wait for work.
        process(b)
        // Reuse buffer if there's room.
        // 使用完毕的buffer
        select {
        // 如果能够返回给 buffer就结束
        case freeList <- b:
            // Buffer on free list; nothing more to do.
        default:
        // 不能就释放
            // Free list full, just carry on.
        }
    }
}

相关文章

  • Go 并发常见讨论

    Go 并发常见讨论 并发 chan Done 控制结束 在service开发的过程中,会有多个异步的线程同时运行,...

  • 第14章-并发性Concurrency

    并发性Concurrency 1.1 什么是并发 Go是并发语言,而不是并行语言。在讨论如何在Go中进行并发处理之...

  • Golang(十四) 并发性Concurrency

    并发性Concurrency 1.1 什么是并发 Go是并发语言,而不是并行语言。在讨论如何在Go中进行并发处理之...

  • Go 并发编程-goroutine 初体验

    说到 Go 语言,被人讨论最多的就是 Go 很擅长做高并发,并且不需要依赖外部的库,语言本身就支持高并发。 Go ...

  • Golang 常见的并发模式

    常见的并发模式 Go语言最吸引人的地方是它内建的并发支持。Go语言并发体系的理论是C.A.R Hoare在1978...

  • Go教程第十七篇: 介绍并发

    Go教程第十七篇: 介绍并发 本文是《Go系列教程》的第十七篇文章。 Go是一个并发语言而不是一个并行语言。在讨论...

  • Go开发关键技术指南:Overview

    Overview 本文讨论了服务器领域常见的并发等问题,也涉及到了工程化相关的问题,也整理了C背景程序员对于Go的...

  • Go开发关键技术指南

    本文讨论了服务器领域常见的并发等问题,也涉及到了工程化相关的问题,也整理了C背景程序员对于Go的GC以及性能的疑问...

  • Go语言并发

    Go语言并发 Go语言级别支持协程,叫做goroutine Go 语言从语言层面支持并发和并行的开发操作 Go并发...

  • Go基础语法(九)

    Go语言并发 Go 是并发式语言,而不是并行式语言。 并发是指立即处理多个任务的能力。 Go 编程语言原生支持并发...

网友评论

      本文标题:Go 并发常见讨论

      本文链接:https://www.haomeiwen.com/subject/mdecyqtx.html