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

几个独立的进程间如何共享锁

  •  
  •   mzmxcvbn · 2022-05-27 14:32:13 +08:00 · 2649 次点击
    这是一个创建于 903 天前的主题,其中的信息可能已经有所发展或是发生改变。

    几个独立的进程(不是由一个 fork 出来的,都是单独跑的)去读写一个文件,为了避免写乱,想着在读写文件时加锁,想问一下大佬们,几个独立的进程间如何共享锁,在同一台设备上的。

    第 1 条附言  ·  2022-05-31 13:10:23 +08:00
    谢谢大佬们的回复,目前用 flock 实现了
    13 条回复    2022-06-05 18:42:00 +08:00
    WildCat
        1
    WildCat  
       2022-05-27 14:35:36 +08:00
    参考 SQLite
    参考 Git
    eote
        2
    eote  
       2022-05-27 14:37:26 +08:00
    不考虑高并发的情况,可以写之前判断指定目录有没有特定空文件,没有则生成,写完再删
    mingl0280
        3
    mingl0280  
       2022-05-27 14:39:15 +08:00
    flock
    shared pthread lock
    semaphore
    就这三种,随便想用哪种咯
    eote
        4
    eote  
       2022-05-27 14:40:22 +08:00
    考虑并发就起个 redis 或者数据库
    GeruzoniAnsasu
        5
    GeruzoniAnsasu  
       2022-05-27 14:40:22 +08:00
    文件锁是内核处理的,不需要「共享」锁,只需要正确地访问文件就够了。

    https://man7.org/linux/man-pages/man2/flock.2.html
    cubecube
        7
    cubecube  
       2022-05-27 14:43:32 +08:00
    性能要求不高的话,/var/run 下面弄个文件锁就行。。
    codehz
        8
    codehz  
       2022-05-27 15:26:45 +08:00
    看你需求,用锁的方案楼上都有写
    如果是每个进程都是往尾部写的情况,倒是可以用 append 模式打开文件,然后一次只发一行(关闭缓冲区避免拆分),日志都是这样做的
    LeegoYih
        9
    LeegoYih  
       2022-05-27 17:53:34 +08:00
    windows 可以调 win32api ,用 mutex 互斥体
    LeeReamond
        10
    LeeReamond  
       2022-06-03 01:01:01 +08:00
    借楼问一下,类似 flock 这种内核提供的文件锁,楼上文档里写是没有超时时间接口的,如果 A 进程获取锁以后挂了,那锁不是永远放不出来了?
    GeruzoniAnsasu
        11
    GeruzoniAnsasu  
       2022-06-04 18:57:36 +08:00
    @LeeReamond A 进程如果还能消失,那么说明内核已经正确处理了这个进程所有资源的释放,包括它持有的任何锁和 fd 。但你要说那种常见的 .lock 文件由于进程崩了没删掉导致程序误判,那属于逻辑问题,跟锁本身无关
    LeeReamond
        12
    LeeReamond  
       2022-06-05 14:25:39 +08:00
    @GeruzoniAnsasu 进程彻底消失的话系统分配的资源也会被释放,很合理。是否存在一种中间状态,比如 windows 操作系统中有类似程序未响应,等待响应的状态,此时资源也没有释放,业务逻辑也没有执行
    GeruzoniAnsasu
        13
    GeruzoniAnsasu  
       2022-06-05 18:42:00 +08:00
    @LeeReamond 当然是有可能的,所以一般还会有非阻塞的使用方式,比如 flock 有个 LOCK_NB 控制位
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2723 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:03 · PVG 10:03 · LAX 18:03 · JFK 21:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.