平时写python脚本,需要控制当前脚本实例只能单例运行,比如一个执行重任务的脚本执行需要消耗大量服务资源或者会出现并发问题的话,那么需要在同一时间控制只能有一个进程运行脚本。
Python的fcntl提供了对文件描述符进行文件控制和IO控制的能力。它是unix系统的fcntl() 和 ioctl()的接口。
fcntl模块提供了如下方法:
- fcntl() : 对文件描述符执行’cmd’操作,'cmd’值与操作系统有关,具体可以查看linux的fcntl(2)
- flock() :对文件描述符进行上锁,具体可以参考linux的flock(2)
- ioctl() :
- lockf() : 对fcntl() 进行锁定包装调用。'fd’是要锁定或者解锁的文件描述符,并且可用下列的值来进行操作:
LOCK_UN-解锁
LOCK_SH-获取共享锁
LOCK_EX-获取独占锁
具体对Python脚本单例执行控制代码如下:
import fcntl
if __name__ == '__main__':
f = open('./statistic.py', 'r')
try:
fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
except BlockingIOError as e:
print('当前有任务在进行中')
exit()
# do something...