Django如何防止定時任務并發(fā)淺析
前言
django提供了commands類,允許我們編寫命令行腳本,并且可以通過python manage.py拉起。
了解commands
具體django commands如何使用,大家參考官方文檔即可:https://docs.djangoproject.com/en/2.2/howto/custom-management-commands/
一個坑
使用時遇到一個坑:在commands運行中的異常并不會打印到屏幕上,它要求我們必須拋出CommandError類型的異常才能被打印到屏幕中,具體參考:https://docs.djangoproject.com/en/2.2/howto/custom-management-commands/#command-exceptions
文件鎖防并發(fā)
我們通常利用Crontab拉起定時任務,那么就會面臨一個常見問題,如何避免前一次沒結束而后一次再次啟動的問題。
通常都是用文件鎖來搞定這個事情,我做了一個簡單的裝飾器來包裝Commands的handle方法,定義一套元類或者類裝飾器都可以達到同樣的目的,這里就不炫技了。
# -*- coding: utf-8 -*-
import fcntl
import os
from apps.settings import CRON_LOCK_DIR
# 嘗試加鎖
def try_lock(name):
def decorator(func):
def wrap(*args, **kwargs):
os.makedirs(CRON_LOCK_DIR, exist_ok=True)
with open('{}/{}'.format(CRON_LOCK_DIR, name), 'w') as fd:
try:
fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) # 加鎖
func(*args, **kwargs)
fcntl.lockf(fd, fcntl.LOCK_UN) # 解鎖
except: # 加鎖異常跳過
pass
return wrap
return decorator
其中CRON_LOCK_DIR是文件鎖的父目錄,下面放了若干鎖文件。
對Commands的handle方法指定鎖文件名即可:
class Command(BaseCommand):
@try_lock('check_order') # 指定鎖文件的名字
def handle(self, *args, **options):
pass
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關文章
python 對dataframe下面的值進行大規(guī)模賦值方法
今天小編就為大家分享一篇python 對dataframe下面的值進行大規(guī)模賦值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
Jupyter安裝nbextensions,啟動提示沒有nbextensions庫
這篇文章主要介紹了Jupyter安裝nbextensions,啟動提示沒有nbextensions庫,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
python時間日期函數與利用pandas進行時間序列處理詳解
python標準庫包含于日期(date)和時間(time)數據的數據類型,datetime、time以及calendar模塊會被經常用到,而pandas則可以對時間進行序列化排序2018-03-03

