python-文件锁,,文件锁(fcntl)
python-文件锁,,文件锁(fcntl)
文件锁(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 osimport sysimport timeimport fcntlimport threadingimport 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-面向对象编程,,面向对象面向对象最重
- Python MQTT 实验,,Two client
- Python3绘图之Matplotlib(03),,饼图 = pie散点
- python接口自动化框架_初级,,1、前提:pytho
- Python人工智能-基于百度接口,,参考百度AI官网:h
- 【python】nuitka封装python,,官网:http://
- 转载一篇文章 python程序在安卓手机上使用,,from kivy.
- python-->GLI,,什么是GLI?Pyt
- Python—元类,,什么是元类?元类是类
- PYTHON学习0013:字符串----2019-6-9,0013----2019-6-9,一、定义
评论关闭