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

最近项目中使用了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,但是通过验证没有重复字段。可能验证的不够完整,但是目前尚未找到原因。

原文地址:https://www.cnblogs.com/veviDP/p/8908797.html

时间: 2024-11-07 19:14:23

GO 协程 通道实例以及验证SnowFlake算法的相关文章

golang协程——通道channel阻塞

新的一年开始了,不管今天以前发生了什么,向前看,就够了. 说到channel,就一定要说一说线程了.任何实际项目,无论大小,并发是必然存在的.并发的存在,就涉及到线程通信.在当下的开发语言中,线程通讯主要有两种,共享内存与消息传递.共享内存一定都很熟悉,通过共同操作同一对象,实现线程间通讯.消息传递即通过类似聊天的方式.golang对并发的处理采用了协程的技术.golang的goroutine就是协程的实现.协程的概念很早就有,简单的理解为轻量级线程,goroutine就是为了解决并发任务间的通

golang 单协程和多协程的性能测试

测试数据:单协程操作1亿数据,以及多协程(10条协程)操作1亿数据(每条协程操作1kw数据) 废话少说,贴代码: 单协程测试运算: package main import ( "fmt" "time" ) func testNum(num int) { for i := 1; i <= 10000000; i++{ num = num + i num = num - i num = num * i num = num / i } } func main() {

Unity中使用协程进行服务端数据验证手段

近期在做项目中的个人中心的一些事情,用户头像上传,下载,本地缓存,二级缓存,压缩,这些都要做,麻雀虽小五脏俱全啊,也是写的浑浑噩噩的, 当我们在上传用户头像的时候,向服务端发送上传头像请求之前,一般都会做一次验证,向服务端获取token验证信息,来确保非法上传,如果不做这个那么会有非法用户上传非法图像,使你的服务器 带来未知的灾难. 而验证的逻辑很好写,并没有什么难度,比如: Server.SendMessage("获取token"); Client.Receive(string to

PYTHON协程实例

1 import gevent 2 def zhao(): 3 print("我姓赵") 4 gevent.sleep(2) 5 print("我叫赵高") 6 def qian(): 7 print("我姓钱") 8 gevent.sleep(1) 9 print("我叫钱多") 10 def sun(): 11 print("我姓孙") 12 gevent.sleep(0) 13 print("

协程与通道

进程:计算机进行资源分配调度的基本单位.且运行在自己内存空间内的独立执行体(一个应用程序就是运行在机器上的一个进程)线程:进程内部共享进程内存资源的多个执行体(当一个线程进行IO时,换另一个线程执行) 并行:同一个程序在某个时间点同时运行在多个处理器核心上.并发:同一时间段内,多个线程执行任务(提高ICU的时间使用率) 协程:根据一个或多个线程的可用性,映射到线程之上(Go tuntime中调度) 同步:进程的多个线程(或者协程)中数据一致 协程工作在相同的地址空间中,所以共享内存(sync包)

socketserver源码解析和协程版socketserver

来,贴上一段代码让你仰慕一下欧socketserver的魅力,看欧怎么完美实现多并发的魅力 client import socket ip_port = ('127.0.0.1',8009) sk = socket.socket() sk.connect(ip_port) sk.settimeout(5) while True: data = sk.recv(1024) print('receive:',data.decode()) inp = input('please input:') sk

python协程函数、递归、匿名函数与内置函数使用、模块与包

目录: 协程函数(yield生成器用法二) 面向过程编程 递归 匿名函数与内置函数的使用 模块 包 常用标准模块之re(正则表达式) 一.协程函数(yield生成器用法二) 1.生成器的语句形式 a.生成器相关python函数.装饰器.迭代器.生成器,我们是如何使用生成器的.一个生成器能暂停执行并返回一个中间的结果这就是 yield 语句的功能 : 返回一个中间值给调用者并暂停执行. 我们的调用方式为yeild 1的方式,此方式又称为生成器的语句形式. 而使用生成器的场景:使用生成器最好的场景就

Unity 协程使用指南

0x00 前言 在使用Unity的过程中,对协程只知道如何使用,但并不知道协程的内部机理,对于自己不清楚的部分就像一块大石压力心里,让自己感觉到担忧和不适.这篇文章一探究竟,彻底揭开协程的面纱,让大家在使用中不再有后顾之忧. 0x01 概念 协程是:程序组件来生成非抢占式多任务子函数,生成的子函数允许在程序里挂起和唤醒操作. 0x02 使用场景 通常协程可以很方便实现延时操作,以及异步加载操作.下面是两个简单协程使用例子. 延时操作 // Use this for initialization

day10-python并发编程之多线程协程及MySQL

第1章 python并发编程之多线程 1.1 死锁现象与递归锁 1.1.1 死锁概念 进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁 1.1.2 博客实例 from threading import Thread,Lock import time mutexA=L