实现一个简单的发号器

根据snowflake算法的原理实现一个简单的发号器,产生不重复、自增的id。

1.snowflake算法的简单描述

这里的snowflake算法是用二进制的,有64位。其中41位的时间戳表示:当前时间戳减去某个设定的起始时间,10位标识表示:不同的机器、数据库的标识ID等等,序列号为每秒或每毫秒内自增的id。

我做的时候没有用位运算去实现,而是做了一个十进制的,16位的(当时项目要求是16位的)。但是实现发号器的基本策略是一样的,通过时间戳和标识来防止重复,通过序列号实现自增。当然啦,重点不是发号器多少位,而是根据项目的实际情况,利用snowflake算法的原理,实现一个适合自己项目的发号器。

2.Python实现

时间戳:9位,起始时间为2018-01-01 00:00:00 ,时间戳为当前时间减去起始时间。时间戳有9为,可用时间为 999999999/(606024*365)≈31(年)。

标识ID:2位,我用的时候比较简单,只是涉及一个数据库的情况,所以用一张数据表对应一个标识ID,可用100张表。

序列号:5位,我时间戳用的是秒级的,但是5位是10万个序列号,经过测试在一秒内是完全够用的。

所以时间戳、标识ID、序列号的位数也没规定说一定要多少,根据自己项目的实际来即可。

代码如下:

import time

class MySnow:

def __init__(self,dataID):

self.start = int(time.mktime(time.strptime('2018-01-01 00:00:00', "%Y-%m-%d %H:%M:%S")))

self.last = int(time.time())

self.countID = 0

self.dataID = dataID # 数据ID,这个自定义或是映射

def get_id(self):

# 时间差部分

now = int(time.time())

temp = now-self.start

if len(str(temp)) < 9: # 时间差不够9位的在前面补0

length = len(str(temp))

s = "0" * (9-length)

temp = s + str(temp)

if now == self.last:

self.countID += 1 # 同一时间差,序列号自增

else:

self.countID = 0 # 不同时间差,序列号重新置为0

self.last = now

# 标识ID部分

if len(str(self.dataID)) < 2:

length = len(str(self.dataID))

s = "0" * (2-length)

self.dataID = s + str(self.dataID)

# 自增序列号部分

if self.countID == 99999: # 序列号自增5位满了,睡眠一秒钟

time.sleep(1)

countIDdata = str(self.countID)

if len(countIDdata) < 5: # 序列号不够5位的在前面补0

length = len(countIDdata)

s = "0"*(5-length)

countIDdata = s + countIDdata

id = str(temp) + str(self.dataID) + countIDdata

return id

使用方法:

snow = MySnow(dataID="00")

print(snow.get_id())

其中dataID即为标识ID,countID为自增序列号。dataID可以一个通过自定义的映射表获得,这个视实际的项目情况而定。

3.关于并发

首先,直接用这个发号器是不能进行并发操作,会产生重复的id。如果真的要进行并发,那么就要权衡一下并发和位数的哪个更重要了!

拿实际例子来说吧,比如我并发的目的是为了节省时间,让程序更快的跑完,这时候为了并发,我把dataID中拿出一位来,标识不同的子进程,这样可以防止产生重复的id。但是实际上这用了位数去换取时间,如果是id位数比较少的情况,比如16位的,dataID比较少,我个人认为这样是不值得的,有些奢侈。这时候便是位数比并发重要啦。

当时如果位数充裕,比如20位的,需要并发就并发啦。

还有一种实现并发的方法,就是给发号器加锁,发号的时候加锁,发完了解锁。这个我没有试过,有兴趣的可以试一下哈哈。但是我有个疑惑啊,就是不断加锁和解锁切换,带来的时间和资源开销会不会很大呢。

本文标题: 如何通过雪花算法用Python实现一个简单的发号器

本文地址: http://www.cppcns.com/jiaoben/python/264336.html

python实现雪花动态图_如何通过雪花算法用Python实现一个简单的发号器相关推荐

  1. 通过雪花(snowflake)算法用Python实现一个简单的发号器

    实现一个简单的发号器 根据snowflake算法的原理实现一个简单的发号器,产生不重复.自增的id. 1.snowflake算法的简单描述 这里的snowflake算法是用二进制的,有64位.其中41 ...

  2. python matpoltlib绘制动态图_使用Python、Geopandas和Matplotlib制作gif动态

    原标题:使用Python.Geopandas和Matplotlib制作gif动态 不需要Photoshop:仅使用Python和命令行制作动画图表. 作为一种编程语言,Python非常灵活.这使得有时 ...

  3. python 网页樱花动态图_如何用Python实现动态图?

    GIF(Graphics Interchange Format,图形交换格式)是一种位图图像格式, GIF格式的图像文件具有如下特点: (1)GIF格式图像文件的扩展名是".gif" ...

  4. python高逼格动态图_微信编辑哪里找高逼格 GIF 动图?

    作为一名运营狗,我觉得这个问题简直为我而生... 之前的回答已经讲得很详细了,我来稍作补充~~ 还是有那么一点点干货的~~ 所以也请给我一点赞吧! 谢(qiu)谢(qiu)大(ni)家(men)了! ...

  5. python 网页樱花动态图_用 Python 绘制美丽的樱花

    可使用以下3种方法引入: 二.使用 turtle库使用起来也很简单,主要就是利用几个核心的控制代码 turtle.goto(x,y):直接跳转到(x,y)点,以绘图窗口中心为原点, turtle.fd ...

  6. 用python画lgx的图_[难度4]MOD教程之Python语言在Module System里的简单应用

    好,从这里开始就假设你已经看过了简明 Python 教程的1~9章了. 看完以后,你再回过头看看Module System里各py文件的文件结构,就看那些以module_开头的,因为以header_开 ...

  7. python怎么绘制渐变图_有没有一种使用Python生成渐变位图的简单方法?

    实现这一点的一种方法是使用matplotlib,正如您在标记中建议的那样.为了做到这一点,我会的使用numpy创建一个NxN数组来表示image_gradient.在 创建一个figure,其大小以英 ...

  8. Python:绘制雪花动态图

    绘制雪花动态图 1.设置函数绘制雪花图: 2.设置函数绘制雪地图: 3.调用两个函数方法. 要求: 控制雪花数量,随机设置雪花颜色RGB,随机设置雪花边数与大小,雪花生成的位置随机飘落. 控制雪地数量 ...

  9. python动态图-Python处理gif动态图的解析与合成操作的介绍

    本篇文章给大家带来的内容是关于Python处理gif动态图的解析与合成操作的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 本文实例讲述了Python图像处理之gif动态图的解析 ...

最新文章

  1. Educational Codeforces Round 37 (Rated for Div. 2)
  2. php信息采集开发,程序php信息采集程序代码
  3. java convexhull_图像上划凸多边形(convexHull()函数)
  4. [原创] nunit2report V1.2.2 release 汉化修正版 V1.0
  5. BIC无代码绘制差异基因火山图
  6. 一个C++工程内存泄漏问题的排查及重现工程
  7. 移动开发—Less基础与安装
  8. express 4.x 获取post提交的数据
  9. 远程桌面连接(连接服务器)报错Oracle修正
  10. NYOJ 3(多边形重心)
  11. Smartbi:用Excel制作移动端的九型人格测试
  12. 基于Proteus学习单片机系列(四)——中断
  13. idea本地项目上传至远程仓库及一些常见问题的解决办法
  14. 电机控制要点解疑:SPWM,SVPWM和矢量控制
  15. arduino与hcsr04_超声波传感器HC-SR04和Arduino进行距离计算
  16. oracle导seq_ORACLE SEQUENCE用法(转)
  17. matlab输出图片至指定文件夹(适用于批量输出)
  18. ps java推荐的笔记本_photoshop无法找到javascvipt增效工具
  19. 好用的字体图标插件:阿里图标库(iconfont)
  20. 凯恩帝绝对坐标清零_数控凯恩帝相对和绝对坐标怎么切换切换,求师傅

热门文章

  1. Can not find the tag library descriptor for /struts-tags问题
  2. 横屏模式(landscape)下的UIDatePicker
  3. 线程打印_Java编程核心技术之——线程操作
  4. html商城加减号,商城购物车的加减号控制商品数量
  5. 软件测试面试题!收藏起来,每天看一看,月薪20K!
  6. java ip地址类,实现获取主机名称,IP地址的类 (java)
  7. 初二计算机会考2019,2019下半年教师资格面试考试初中信息技术试题及解析2
  8. python 内置函数_python的内置函数、方法
  9. 自学软件测试!自学到什么程度可以出去找工作...拿到阿里offer才知道这就够用了...
  10. 金九银十,年轻人跳槽时,尽量不要选择这三类得不偿失的公司