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
firejoke
V2EX  ›  Python

用什么姿势读取配置文档更优雅? 会在运行时更改的那种

  •  
  •   firejoke · 2019-05-24 09:53:29 +08:00 · 3260 次点击
    这是一个创建于 2014 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原帖: /t/567079
    本来选的 python 节点,
    可能因为"大家", "都是", "怎样" "?" 这些关键字, 被移动到调查节点了
    有个需求是可能会在运行中修改配置文档, 然后其他同样引用了该配置的模块也能拿到新的值
    代码在原帖内

    24 条回复    2019-05-27 11:27:06 +08:00
    THESDZ
        1
    THESDZ  
       2019-05-24 09:55:58 +08:00
    缓存中读取,避免脏读即可
    firejoke
        2
    firejoke  
    OP
       2019-05-24 10:07:10 +08:00
    @THESDZ 关键是如何优雅的避免脏读呢?
    besttime
        3
    besttime  
       2019-05-24 10:10:58 +08:00
    配置中心服务了解一下?
    dapang1221
        4
    dapang1221  
       2019-05-24 10:12:46 +08:00
    正常应该是接受处理 USR1 信号,平滑重载更新配置缓存吧,你总不能开着文件句柄一直读,太难受了…
    firejoke
        5
    firejoke  
    OP
       2019-05-24 10:16:44 +08:00
    @dapang1221 我原帖内最后就是这样, 启动时先载入配置缓存, 有修改时先修改文档, 在重新加载到缓存, 但我的方式感觉读取配置时怪怪的
    firejoke
        6
    firejoke  
    OP
       2019-05-24 10:17:57 +08:00
    @besttime 小工具用不上这个吧?
    pmispig
        7
    pmispig  
       2019-05-24 10:18:30 +08:00
    增加一个接口,被调用时从外部拉取配置更新到内存里,我的 openrestry 就是这么操作的
    firejoke
        8
    firejoke  
    OP
       2019-05-24 10:23:54 +08:00
    @pmispig 那你在其他地方引用该配置的时候, 是用的时候在引用吗?
    还是在开头就引用了?
    也就是
    from conf import xxx

    class X():
    def xx():
    XXX
    还是

    class X():
    def xx():
    from conf import xxx
    XXX
    mooncakejs
        9
    mooncakejs  
       2019-05-24 10:28:24 +08:00
    赞同#4
    pmispig
        10
    pmispig  
       2019-05-24 10:30:51 +08:00
    @firejoke 简化来说的话就是 global config = {} , 全局变量,不过细化来说的话还涉及到读写锁
    julyclyde
        11
    julyclyde  
       2019-05-24 10:33:53 +08:00
    一般是 HUP 信号吧
    firejoke
        12
    firejoke  
    OP
       2019-05-24 10:35:05 +08:00
    @dapang1221 抱歉, 我去认真看一下 USR1 和如何应用
    firejoke
        13
    firejoke  
    OP
       2019-05-24 10:36:03 +08:00
    @pmispig 我原帖的举例就是 gloabl conf=dict(), 不过没涉及到独写锁, 你提醒了我
    zgzhang
        14
    zgzhang  
       2019-05-24 11:00:03 +08:00
    @pmispig openrestry 在 init-worker 阶段可以注册定时器,你这样相当于每个请求都耦合了一次配置刷新的操作
    firejoke
        15
    firejoke  
    OP
       2019-05-24 11:18:41 +08:00
    @dapang1221 看 USR1 的应用, 以及 uwsgi 的配置文档重启, 但那个适合静态的配置, 改一次重启一次服务,
    可我只想依赖这个配置的模块能获取到新的值, 并不想重启整个服务, 因为我这只是一个工具, 并不会涉及到并发之类的
    dapang1221
        16
    dapang1221  
       2019-05-24 11:47:01 +08:00
    @firejoke 不是重启整个服务啊,python 里用 signal 模块可以捕获到 USR1 或是上面 11#提到的 HUP 信号,然后你自己处理就好了,并不是让系统去给你重启
    leegoo
        17
    leegoo  
       2019-05-24 13:04:15 +08:00
    可以借鉴配置中心...或者说可以把配置写在数据库里面,系统文件里面都行...
    THESDZ
        18
    THESDZ  
       2019-05-24 16:48:09 +08:00
    @firejoke 合理的事务控制,中心化配置
    raighne
        19
    raighne  
       2019-05-24 17:03:01 +08:00
    用 apollo
    lolizeppelin
        20
    lolizeppelin  
       2019-05-25 18:06:13 +08:00
    inotify 监控配置文件,有变更就调用重载配置函数

    配置文件的库的库最好支持参数设置是否可以热重载

    请使用 python 里最牛逼的配置文件库 oslo.cfg
    firejoke
        21
    firejoke  
    OP
       2019-05-27 09:52:45 +08:00
    @lolizeppelin 看 openstack 时, 看过 oslo 的用法, 没有仔细研究过, 确实可以试试
    firejoke
        22
    firejoke  
    OP
       2019-05-27 09:53:30 +08:00
    @raighne 这个有点大材小用了
    lolizeppelin
        23
    lolizeppelin  
       2019-05-27 11:14:42 +08:00
    @firejoke
    熟悉以后 只要你还用 py, 这玩意可以用不少年
    不 py 语言允许都可以抄一份
    firejoke
        24
    firejoke  
    OP
       2019-05-27 11:27:06 +08:00
    @lolizeppelin 好! 之后也要搞 openstack, 大不了我把离线包加到依赖包里, 装我这个工具的时候, 直接装进去
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5618 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:40 · PVG 11:40 · LAX 19:40 · JFK 22:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.