python-文件锁
- 文件锁(fcntl)
- fcntl这个模块是Python自带的,但Windows没有,可以手工下载fcntl.py文件,然后保存到python的Lib目录下
- 锁类型(fcntl.flock函数的第二个参数)
LOCK_SH: 表示要创建一个共享锁,所有进程没有写访问权限,即使是加锁进程也没有。所有进程有读访问权限,在任意时间内,一个文件的共享锁可以被多个进程拥有。
LOCK_EX: 表示创建一个排他锁,除加锁进程外其他进程没有对已加锁文件读写访问权限,在任意时间内,一个文件的排他锁只能被一个进程拥有。
LOCK_UN: 表示删除该进程创建的锁
LOCK_NB: 如果指定此参数,函数不能获得文件锁就立即返回,否则,函数会等待获得文件锁。LOCK_NB可以同LOCK_SH或LOCK_NB进行按位或(|)运算操作。 fcnt.flock(f,fcntl.LOCK_EX|fcntl.LOCK_NB)
LOCK_MAND:它主要是用于共享模式强制锁,它可以与 LOCK_READ 或者 LOCK_WRITE 联合起来使用,从而表示是否允许并发的读操作或者并发的写操作(尽管在 flock() 的手册页中没有介绍LOCK_MAND,但是阅读内核源代码就会发现,这在内核中已经实现了)
# -*- coding:utf-8 -*-
'''
锁类型(fcntl.flock函数的第二个参数)
LOCK_SH: 表示要创建一个共享锁,在任意时间内,一个文件的共享锁可以被多个进程拥有
LOCK_EX: 表示创建一个排他锁,在任意时间内,一个文件的排他锁只能被一个进程拥有
LOCK_UN: 表示删除该进程创建的锁
LOCK_MAND:它主要是用于共享模式强制锁,它可以与 LOCK_READ 或者 LOCK_WRITE 联合起来使用,从而
表示是否允许并发的读操作或者并发的写操作(尽管在 flock() 的手册页中没有介绍
LOCK_MAND,但是阅读内核源代码就会发现,这在内核中已经实现了)
'''
import os
import sys
import time
import fcntl
import threading
import random
# 如下例子中,分别加锁和不加锁,结果
# 不加锁时,多个线程间竞争文件写权限,会出现覆盖,导致写内容不可预期(见test.log.withoutlock)
# 加锁时,多个线程间会等待一个线程结束(因为设置的是阻塞锁)后,第二个线程才开始写,不会相互
# 覆盖(见test.log.withlock)
def demo(name="null"):
fp = open("test.log", "a+")
cnt = 0
# 在3s内随机等待一段时间,打乱加锁顺序
time.sleep(float(random.randint(0, 300)) / 300)
fcntl.flock(fp, fcntl.LOCK_EX)
print "call demo by %s" % name
# 在10s内进行写入,为了避免写入的内容过多,写0.5s,停0.5s
for i in range(10):
# 写0.5s
for i in range(100):
fp.write("write by %s, %d\n" % (name, cnt))
cnt += 1
time.sleep(0.005)
# 停0.5s
time.sleep(0.5)
fcntl.flock(fp, fcntl.LOCK_UN)
fp.close()
if __name__ == "__main__":
# 创建3个进程,并发写入
for cnt in range(3):
name = "thread_%d" % cnt
thd = threading.Thread(target=demo, args=(name,))
thd.start()
未加锁时,线程写入异常

python-文件锁的更多相关文章
- Python多进程操作同一个文件,文件锁问题
最近工作当中做了一个项目,这个项目主要是操作文件的. 在操作耗时操作的时候,我们一般采用多线程或者多进程.在开发中,如果多个线程需要对文件进行读写操作,就需要用到线程锁或者是文件锁. 使用fcntl ...
- python中进程间通讯——文件锁之fcntl模块的使用
python 中给文件加锁——fcntl模块import fcntl 打开一个文件##当前目录下test文件要先存在,如果不存在会报错.或者以写的方式打开f = open('./test')对该文件加 ...
- python的文件锁使用
python的文件锁目前使用的是fcntl这个库,它实际上为 Unix上的ioctl,flock和fcntl 函数提供了一个接口. 1.fcntl库的简单使用 import fcntl import ...
- python 使用跨平台文件锁
#encoding=utf-8 print '中国' #使用跨平台文件锁 import os if os.name == 'nt': import win32con,win32file,pywinty ...
- Python中的logging模块
http://python.jobbole.com/86887/ 最近修改了项目里的logging相关功能,用到了python标准库里的logging模块,在此做一些记录.主要是从官方文档和stack ...
- Python爬取CSDN博客文章
0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...
- Python实现脚本锁功能,同时只能执行一个脚本
1. 文件锁 脚本启动前检查特定文件是否存在,不存在就启动并新建文件,脚本结束后删掉特定文件. 通过文件的判断来确定脚本是否正在执行. 方法实现也比较简单,这里以python脚本为例 #coding= ...
- 用gdb调试python多线程代码-记一次死锁的发现
| 版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.如有问题,可以邮件:wangxu198709@gmail.com 前言 相信很多人都有 ...
- python logging method 02
基本用法 下面的代码展示了logging最基本的用法. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
- 嘿!我用python帮我干这些事
python 无疑是当下火上天的语言,但是我们又不拿来工作,那么能拿来干啥呢?我是这么干的. 1. 平时工作开发用不上,就当个计算器吧! python # 加减乘除 >>> (3 + ...
随机推荐
- qtp中type方法的按键常量
记录键盘操作可以用set和presskey方法,而type方法是不记录的.type方法主要用于输入连接文本字符串和键盘修饰键(组合键),组合键之间用&符号. 如:JavaWindow(&quo ...
- Sublime自动去除代码行尾多余的空格
Preferences - > Settings - User 加入: "trim_trailing_white_space_on_save": true Ctrl+s就会自 ...
- 微信浏览器无法跳转到apk下载链接 微信屏蔽了我的APP下载链接如何处理
由于微信的限制,应用文件在内置浏览器中下载全部被屏蔽掉,造成很多人用微信扫描二维码下载时,界面显示一片空白,容易误导以为在下载呢 <!DOCTYPE html><html>&l ...
- VMware虚拟机开机自启动
VMware虚拟机开机自启动 linux 2018年05月09日 08时30分18秒 VMware的命令行语句可以切换到VMware安装目录,使用vmrun.exe --help(windows下)查 ...
- sed 命令总结
sed是Stream Editor的缩写,是操作.过滤.转换文本内容的强大工具,对文件实现增删改查 主要参数 -n 取消默认输出 -i 修改保存文件 内置命令字符 a,append追加 d,delet ...
- python入门(三)
一.判断(精简代码) 非空为真,非0为真# 不为空的话就是true,是空的话就是false# 只要不是0就是true,是0就是falsea=[]#list也是假的b={}#字典也是假的c=0 #也是假 ...
- No space left on device Linux系统磁盘空间已满
1. 删除系统日志等 删除生成 core,mbox等文件 #find / -name core|xargs rm –rf 删除日志 2.重起机器
- oralce定时任务
oracle定时任务(dbms_job) author:skate time:2007-09-12 http://publish.it168.com/2006/0311/20060311017002. ...
- centos7初上手1-安装mysql数据库
随着云服务器的普及,购入云服务器的门槛越来越低,对一个程序员来说,很多人会购买一款云服务器.以前买过两年windows服务器(没有什么实际用途,就是为了玩),最近有机会接触一下linux服务器,选择了 ...
- (简单)华为Nova3 PAR-AL00的USB调试模式在哪里开启的步骤
当我们使用Pc链接安卓手机的时候,如果手机没有开启Usb调试模式,Pc则没能够成功检测到我们的手机,有时候我们使用的一些功能比较强的的APP如之前我们使用的一个APP引号精灵,老版本就需要开启Usb调 ...