1. 程式人生 > 程式設計 >在django-xadmin中APScheduler的啟動初始化例項

在django-xadmin中APScheduler的啟動初始化例項

環境: python3.5.x + django1.9.x + xadmin-for-python3

APScheduler做為一個輕量級和使用量很多的後臺任務計劃(scheduler)包,可以方便的隨系統啟動/關閉而啟動/關閉,如果整合到django中,啟動APScheduler的程式碼該寫在哪裡好呢,

以下幾個方式供參考:

1. (推薦)自定義Middleware,非常類似Java中的Filter,缺點是要有URL訪問才會觸發啟動,如果系統還沒有啟動完就訪問了URL會觸發__init__多次呼叫(多次http同時請求造成),可以通過threading的lock同步程式碼和狀態限制執行一次

class StartupMiddleware(object):
 def __init__(self):
  #啟動後臺任務APScheduler
  init_scheduler()
 
  from django.core.exceptions import MiddlewareNotUsed
  raise MiddlewareNotUsed #TIP 丟擲此異常,則Django將從 middleware 棧中移出該 middleware,請求就不會經過此middleware
 
 def process_request(self,request):
  print("*****enter startup middleware")
scheduler = None
def init_scheduler():
 global scheduler
 lock = threading.Lock() # TIP 多執行緒同步程式碼
 with lock:
  if scheduler and scheduler.running:
   print('*****APScheduler is already started,pid:{},tid:{}'.format(os.getpid(),threading.current_thread().getName()))
   return scheduler
  executors = {
   'default': ThreadPoolExecutor(5),#執行緒模式下程序池大小
   'processpool': ProcessPoolExecutor(5),#程序模式下程序池大小
  }
  job_defaults = {
   'coalesce': True,#如果有幾次未執行,條件可以時是否只執行一次
   'max_instances': 1,#同一個job同一時間最多有幾個例項再跑
  }
 
  scheduler = BackgroundScheduler(executors=executors,job_defaults=job_defaults,timezone=timezone(TIME_ZONE))
 
  scheduler.add_job(...)
  scheduler.start()
  return scheduler

2. 應用中的settings.py檔案,django在開發環境預設會啟動兩個python程序(對於開發環境還是很實用的,改程式碼後會自動重啟),放settings.py中的程式碼會被這兩個python程序都呼叫一次,當然可以通過--reload引數只啟動一個python程序,另外載入settings.py時部分app還未loaded,限制了應用的程式碼。

3. 頂層的urls檔案, 這個不管你django啟動時是一個程序還是兩個程序,urls檔案也只會被載入一次,但存在的缺陷就是在執行makemigrations這樣的命令時,會同樣出現app還未loaded的錯...

以上這篇在django-xadmin中APScheduler的啟動初始化例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。