平時寫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...