V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
oldgun
V2EX  ›  Python

如何按一定规则生成一个编号

  •  
  •   oldgun · 2011-03-25 21:32:42 +08:00 · 6137 次点击
    这是一个创建于 4998 天前的主题,其中的信息可能已经有所发展或是发生改变。
    问题是这样的:
    需要生成一个编号,分类+日期+随机编号(自增);
    例如分类01,日期2011年03月25日,随机编号001,那生成编号0120110325001。
    这个该如何处理?
    14 条回复    1970-01-01 08:00:00 +08:00
    oldgun
        1
    oldgun  
    OP
       2011-03-25 22:34:18 +08:00
    有人愿意看一下吗?
    keakon
        2
    keakon  
       2011-03-25 22:56:24 +08:00
    可以试试generator
    http://www.python.org/dev/peps/pep-0289/

    from datetime import date

    def number_generator(type_number):
    last_day = date.today()
    number = 0
    while True:
    today = date.today()
    if last_day == today:
    number += 1
    else:
    last_day = today
    number = 1
    yield '%s%s%03d' % (type_number, today.strftime('%Y%m%d'), number)

    generator = number_generator('01')
    print generator.next()
    print generator.next()
    print generator.next()
    print generator.next()

    结果:
    0120110325001
    0120110325002
    0120110325003
    0120110325004
    oldgun
        3
    oldgun  
    OP
       2011-03-25 23:11:52 +08:00
    @keakon 谢谢!
    不过忘了关键点了,补充一下,在分布式和并发环境下如何保证编号的连续及唯一呢?想过利用数据库的sequence 但最好不要。用锁吗?
    keakon
        4
    keakon  
       2011-03-25 23:26:29 +08:00
    @oldgun 这和语言无关了,可以用数据库或memcached之类服务的来实现
    oldgun
        5
    oldgun  
    OP
       2011-03-25 23:31:02 +08:00
    @keakon 因为想用sqlite或Berkeleydb,数据库层面实现很基本无望。oracle的sequence应该可以,不过高并发下恐怕效率会很低。初步想建一个带锁机制的服务来解决了。
    summic
        6
    summic  
       2011-03-25 23:33:11 +08:00
    唯一性的问题,存数据库,然后实现一个乐观锁就行了
    oldgun
        7
    oldgun  
    OP
       2011-03-25 23:33:42 +08:00
    @keakon 关键解决分布式,高并发的话应该不会达到,不然就要换数据库了。
    oldgun
        8
    oldgun  
    OP
       2011-03-25 23:37:21 +08:00
    @summic 不用数据库
    napoleonu
        9
    napoleonu  
       2011-03-25 23:53:29 +08:00
    编号为什么一定要连续呢?
    oldgun
        10
    oldgun  
    OP
       2011-03-26 00:05:01 +08:00
    @napoleonu 因为这是要求,总有一些要求的,这是其中一个。
    napoleonu
        11
    napoleonu  
       2011-03-26 00:22:03 +08:00
    @oldgun 是要最终连续还是要按照写数据的时间循序连续?我觉的问题描述不清楚,分布式的单点会不会一直增加?要不要考虑单点故障?
    summic
        12
    summic  
       2011-03-26 12:40:00 +08:00
    @oldgun 总之要有一个单点来存储吧?不然怎么知道上一个自增的编号到几了
    Kymair
        13
    Kymair  
       2011-03-26 12:53:03 +08:00 via Android
    可以考虑下Redis
    自增和自减是原子的
    经常被拿来做id generator
    oldgun
        14
    oldgun  
    OP
       2011-03-26 14:44:54 +08:00
    @oldgun 不能用编好号来取用的方式。
    对不起有个要求没说清楚,编号是按时间连续的与分类无关,分类是个标识。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2262 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:52 · PVG 08:52 · LAX 16:52 · JFK 19:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.