最近工作当中做了一个项目,这个项目主要是操作文件的。
在操作耗时操作的时候,我们一般采用多线程或者多进程。在开发中,如果多个线程需要对文件进行读写操作,就需要用到线程锁或者是文件锁。
使用fcntl
在Linux下,Python的标准库有线程的文件锁,来自fcntl模块。这个模块提供了Unix系统fcntl()和ioctl()的接口。
对于文件锁的操作,主要需要使用fcntl.flock(fd,operation)这个函数。
其中,参数fd表示文件描述符;参数operation指定要进行的锁操作,该参数的取值有如下几种:
LOCK_SH:表示要穿件一个共享锁,在任意时间内,一个文件的共享锁可以被多个进程拥有。
LOCK_EX:表示创建一个排它锁,在任意时间内,一个文件的排它锁只能被一个进程拥有
LOCK_UN:表示删除该进程创建的锁
LOCK_MAND:它主要是用于共享模式强制锁,它可以与LOCK_READ或者LOCK_WRITE联合起来使用,从而表示是否允许并发的读操作或者并发的写操作。
我这次工作的应用场景是两个py文件操作同一个文本,所以是多进程操作文本。
#!/usr/bin/python#coding:utf-8
importfcntlimportthreadingimporttimedefwritetoTxt():
id=threading.currentThread().getName()
with open("aaa.txt", "a") as f:#fcntl.flock(f.fileno(), fcntl.LOCK_EX) # 加锁
print("{} acquire