首页 > 其他分享 >Go: process synchronization

Go: process synchronization

时间:2023-04-24 19:33:08浏览次数:31  
标签:producer package process synchronization Go runtime

 

package main

import (
    "fmt"
    "math"
    "runtime"
    "strconv"
    "strings"
    "time"
)

func producer(intChan chan int) {
    for b := 1000; b <= 1099; b++ {
        intChan <- b
    }
    close(intChan)
}
func consumer(intChan chan int, primeChan chan int, exitChan chan bool) {
    var b, ok, flag = 0, true, true
    var lastNumber int
    for {
        lastNumber = b
        b, ok = <-intChan
        if !ok {
            exitChan <- true
            break
        }
        flag = true
        for v := 2; v < int(math.Sqrt(float64(b)))+1; v++ {
            time.Sleep(time.Millisecond * 30)
            if b%v == 0 {
                flag = false
                break
            }
        }
        if flag {
            primeChan <- b
        }
    }
    fmt.Printf("Goroutine(%03v) exit, last number: %v\n", GetGoroutineID(), lastNumber)
}
func main() {
    intChan := make(chan int, 100)
    primeChan := make(chan int, 2000)
    exitChan := make(chan bool, 4)
    go producer(intChan)
    for i := 0; i < cap(exitChan); i++ {
        go consumer(intChan, primeChan, exitChan)
    }

    go func() {
        for i := 0; i < cap(exitChan); i++ {
            <-exitChan
        }
        close(exitChan)
        close(primeChan)
    }()
    for {
        v, ok := <-primeChan
        if !ok {
            break
        }
        fmt.Printf("Prime: %v\n", v)
    }
    fmt.Printf("main Goroutine(%v) exit", GetGoroutineID())
}

func GetGoroutineID() int {
    var buf = make([]byte, 128)
    b := runtime.Stack(buf, false)
    idField := strings.Fields(strings.TrimPrefix(string(buf[:b]), "goroutine "))[0]
    id, err := strconv.Atoi(idField)
    if err != nil {
        panic(fmt.Sprintf("cannot get goroutine id: %v", err))
    }
    return id
}

 

标签:producer,package,process,synchronization,Go,runtime
From: https://www.cnblogs.com/dissipate/p/17350611.html

相关文章

  • Django 静态文件 request对象方法 pycharm和Django连接MySQL Django模型层初步了解 基
    目录静态文件一、概念静态文件:不经常变化的文件,主要针对html文件所使用到的各种资源。例如:css文件、js文件、img文件、第三方框架文件ps:Django针对静态文件资源需要单独在根目录创建一个static目录统一存放,该目录下的文件类型还有很多,例如:utils目录,plugins目录,li......
  • django中的主表和从表
    一、主表和从表在Django中,ORM的关系模型中,有主表和从表之分。其中,主表又称为“一方表”,从表也称为“多方表”。这里举个简单的例子:假设有两个模型 Blog 和 Entry,每个 Blog 包含多个 Entry:classBlog(models.Model):name=models.CharField(max_length=100)......
  • go 语言基本语法
    一、go语言初探1.基本数据类型整型(int)、浮点型(float)、布尔型(bool)、字符串(string)2.复合数据类型数组、切片、结构体、函数、map、通道(channel)、接口等3.安装Beegoinstallgithub.com/beego/bee/v2@master4.命令:goversion#查看go的安装版本go......
  • go语言01 介绍 搭建 变量命名与使用
    今日内容目录今日内容1Go语言介绍2Go开发环境搭建3第一个helloworld4变量命名规范5变量的定义和使用1Go语言介绍#Go语言介绍Go即Golang,是Google公司2009年11月正式对外公开的一门编程语言Go是【静态强类型】语言,是区别于解析型语言的编译型语言(静态:类型固定强类型:......
  • go介绍
    go介绍go即golang,是Google公司2009年11月正式对外公开的一门编程语言go是一种静态,强类型语言,是编译型语言(静态:类型固定强类型:不同类型不允许直接运算)解释性语言:源代码由解析器对代码进行解释执行编译型语言:源代码编译生成机器语言,然后由机器执行机器码可执行编译型语......
  • Django4全栈进阶之路16 template模板的基础模板
    <!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>{%blocktitle%}MySite{%endblock%}</title>{%blockstyles%}{%endblock%}</head><body><header><h1>MySite</h......
  • 1 Golang入门
    目录1Golang入门1Golang介绍1.1简介1.2特性1.3go语言发展1.4go语言的应用2go2.1包2.2main包2.3go程序的运行方式2.4声明包与包导入1Golang入门1Golang介绍1.1简介Go即Golang,是Google公司2009年11月正式对外公开的一门编程语言Go是【静态强类型】语言,是区别于......
  • 2 Golang语法基础
    目录2Golang语法基础1变量命名规范2语法规则:变量的定义与使用①完整定义②类型推导:自动推导出变量,是什么类型③简略声明:2Golang语法基础1变量命名规范Go语言中的函数名、变量名、常量名、类型名和包名等所有的命名,都遵循一个简单的命名规则:①一个名字必须以一个字......
  • Rust、Go 和 Swift 在性能和并发性方面有何差异?
    Rust是一种系统编程语言,旨在快速、安全和并发。其性能令人印象深刻,可以生成快速高效的机器代码。Rust 的编译器使用 LLVM 基础架构,它针对目标架构优化了代码。此外,Rust 的所有权和借用系统确保内存得到有效管理,没有任何运行时开销。Rust的并发模型是基于actor模型的,也就是说并......
  • Go语言介绍、Go开发环境搭建、第一个helloworld、变量命名规范、变量的定义和使用
    目录1Go语言介绍2Go开发环境搭建3第一个helloworld4变量命名规范5变量的定义和使用1Go语言介绍#Go语言介绍Go即Golang,是Google公司2009年11月正式对外公开的一门编程语言Go是【静态强类型】语言,是区别于解析型语言的编译型语言(静态:类型固定强类型:不同类型不允许直接......