Django如何防止定時任務(wù)并發(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拉起定時任務(wù),那么就會面臨一個常見問題,如何避免前一次沒結(jié)束而后一次再次啟動的問題。
通常都是用文件鎖來搞定這個事情,我做了一個簡單的裝飾器來包裝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
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
python 實現(xiàn)mysql自動增刪分區(qū)的方法
這篇文章主要介紹了python 實現(xiàn)mysql自動增刪分區(qū)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
python 對dataframe下面的值進行大規(guī)模賦值方法
今天小編就為大家分享一篇python 對dataframe下面的值進行大規(guī)模賦值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
Python numpy有哪些常用數(shù)據(jù)類型
Numpy提供了兩種基本的對象:ndarray(N-dimensional Array Object)和 ufunc(Universal Function Object)。ndarray是存儲單一數(shù)據(jù)類型的多維數(shù)組,而ufunc則是能夠?qū)?shù)組進行處理的函數(shù)2023-02-02
Jupyter安裝nbextensions,啟動提示沒有nbextensions庫
這篇文章主要介紹了Jupyter安裝nbextensions,啟動提示沒有nbextensions庫,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
python時間日期函數(shù)與利用pandas進行時間序列處理詳解
python標(biāo)準(zhǔn)庫包含于日期(date)和時間(time)數(shù)據(jù)的數(shù)據(jù)類型,datetime、time以及calendar模塊會被經(jīng)常用到,而pandas則可以對時間進行序列化排序2018-03-03
Python標(biāo)準(zhǔn)庫os常用函數(shù)和屬性詳解
os模塊是Python標(biāo)準(zhǔn)庫中的一個用于訪問操作系統(tǒng)相關(guān)功能的模塊,os模塊提供了一種可移植的使用操作系統(tǒng)功能的方法,本文給大家介紹下?OS標(biāo)準(zhǔn)庫常用函數(shù)和屬性,感興趣的朋友跟隨小編一起看看吧2022-11-11

