• GO 协程 通道实例以及验证SnowFlake算法 Vevi


    最近项目中使用了SnowFlake算法产生ID,并在实际运行环境下会产生重复ID,所以写了一个Go的程序进行验证,顺便也练习一下Go的协程与通道。

    至于GO的协程和通道的基础知识请自行百度。

    代码如下:

    package main
    
    import (
    	"fmt"
    	"github.com/zheng-ji/goSnowFlake"
    )
    
    func main() {
    	fmt.Println("Hell Go !")
    
    	iw, err := goSnowFlake.NewIdWorker(1)
    	if err != nil {
    		fmt.Println(err)
    	}
    
    	cons := map[int64]int{}
    
    	chncount := 10
    	chs := make([]chan int, chncount)
    
    	for j := 0; j < chncount; j++ {
    		chs[j] = make(chan int)
    		go func(idx int) {
    			for i := 0; i < 10000; i++ {
    				if id, err := iw.NextId(); err == nil {
    					if _, ok := cons[id]; ok {
    						fmt.Println(idx, "   ", id)
    					}
    				}
    			}
    			chs[idx] <- 1
    		}(j)
    	}
    
    	for i := 0; i < chncount; i++ {
    		<-chs[i]
    	}
    
    }  

    运行结果如下:

    GOROOT=C:\Go #gosetup
    GOPATH=D:\GO\TestPros;D:\GO\TestPros\src;D:\GO\GOPATH #gosetup
    C:\Go\bin\go.exe build -i -o D:\GO\TestPros\bin\TestPros.exe D:/GO/TestPros/src/goroutine.go #gosetup
    "C:\Program Files\JetBrains\GoLand 2018.1.1\bin\runnerw.exe" D:\GO\TestPros\bin\TestPros.exe #gosetup
    Hell Go !
    
    Process finished with exit code 0
    

    共使用了10个协程,每个协程产生1000个ID,但是通过验证没有重复字段。可能验证的不够完整,但是目前尚未找到原因。

  • 相关阅读:
    02 微服务应用的认证与授权
    01 微服务架构中的服务发现作用以及两种协议的调用区别
    04 redis的数据结构与对象
    03 Spring的事务管理的基本使用
    02 Spring的AOP的基础概念与简单使用
    k8s环境部署
    elk安装
    实现AD域验证登录--
    linux SSH各配置项解释
    Linux学习之SAMBA共享(密码验证)
  • 原文地址:https://www.cnblogs.com/veviDP/p/8908797.html
Copyright © 2020-2023  润新知