欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django異步任務線程池實現(xiàn)原理

 更新時間:2019年12月17日 08:30:24   作者:luozx207  
這篇文章主要介紹了Django異步任務線程池實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了Django異步任務線程池實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

當數(shù)據(jù)庫數(shù)據(jù)量很大時(百萬級),許多批量數(shù)據(jù)修改請求的響應會非常慢,一些不需要即時響應的任務可以放到后臺的異步線程中完成,發(fā)起異步任務的請求就可以立即響應

選擇用線程池的原因是:線程比進程更為可控。不像子進程,子線程會在所屬進程結束時立即結束。線程可共享內存。

請求任務異步處理的原理

使用python manage.py runserver模式啟動的Django應用只有一個進程,對于每個請求,主線程會開啟一個子線程來處理請求。請求子線程向主線程申請一個新線程,然后把耗時的任務交給新線程,自身立即響應,這就是請求任務異步處理的原理。

可視化線程池

如果想要管理這批異步線程,知道他們是否在運行中,可以使用線程池(ThreadPoolExecutor)。

線程池會先啟動若干數(shù)量的線程,并讓這些線程都處于睡眠狀態(tài),當向線程池submit一個任務后,會喚醒線程池中的某一個睡眠線程,讓它來處理這個任務,當處理完這個任務,線程又處于睡眠狀態(tài)。

submit任務后會返回一個期程(future),這個對象可以查看線程池中執(zhí)行此任務的線程是否仍在處理中

因此可以構建一個全局可視化線程池:

from concurrent.futures.thread import ThreadPoolExecutor


class ThreadPool(object):
  def __init__(self):
    # 線程池
    self.executor = ThreadPoolExecutor(20)
    # 用于存儲每個項目批量任務的期程
    self.future_dict = {}

  # 檢查某個項目是否有正在運行的批量任務
  def is_project_thread_running(self, project_id):
    future = self.future_dict.get(project_id, None)
    if future and future.running():
      # 存在正在運行的批量任務
      return True
    return False

  # 展示所有的異步任務
  def check_future(self):
    data = {}
    for project_id, future in self.future_dict.items():
      data[project_id] = future.running()
    return data

  def __del__(self):
    self.executor.shutdown()

# 主線程中的全局線程池
# global_thread_pool的生命周期是Django主線程運行的生命周期
global_thread_pool = ThreadPool()

使用:

# 檢查異步任務
if global_thread_pool.is_project_thread_running(project_id):
  raise exceptions.ValidationError(detail='存在正在處理的批量任務,請稍后重試')

# 提交一個異步任務
future = global_thread_pool.executor.submit(self.batch_thread, project_id)
global_thread_pool.future_dict[project_id] = future

# 查看所有異步任務
@login_required
def check_future(request):
  data = global_thread_pool.check_future()
  return HttpResponse(status=status.HTTP_200_OK, content=json.dumps(data))

串行執(zhí)行

使用線程鎖

在全局線程池中初始化線程鎖

class ThreadPool(object):
  def __init__(self):
    self.executor = ThreadPoolExecutor(20)
    self.future_dict = {}
    self.lock = threading.Lock()

然后執(zhí)行線程前需要獲取鎖并再執(zhí)行結束后釋放鎖

def batch_thread(self):
  global_thread_pool.lock.acquire()
  try:
    ...
    global_thread_pool.lock.release()
  except Exception:
    trace_log = traceback.format_exc()
    logger.error('異步任務執(zhí)行失敗:\n %s' % trace_log)
    global_thread_pool.lock.release()

需要捕捉異常預防子線程出錯而無法釋放鎖的情況

異步線程任務執(zhí)行前先檢查數(shù)據(jù)庫連接是否可用,然后關掉不可用連接

由于django的數(shù)據(jù)庫連接是保存到線程本地變量中的,通過ThreadPoolExecutor創(chuàng)建的線程會保存各自的數(shù)據(jù)庫連接。

當連接被保存的時間超過mysql連接的最大超時時間,連接失效,但不會被線程釋放。

之后再調起線程執(zhí)行涉及到數(shù)據(jù)庫操作的異步任務時,會用到失效的數(shù)據(jù)庫連接,導致報錯“MySQL server has gone away”。

解決方案是在線程池的所有異步任務執(zhí)行前先檢查數(shù)據(jù)庫連接是否可用,然后關掉不可用連接

def batch_thread(self):
  for conn in connections.all():
    conn.close_if_unusable_or_obsolete()
  ...

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python 圖像處理之顏色遷移(reinhard VS welsh)

    Python 圖像處理之顏色遷移(reinhard VS welsh)

    這篇文章主要介紹了分別利用reinhard算法和welsh算法實現(xiàn)圖像的顏色遷移,并對二者算法的效果進行了對比,感興趣的小伙伴可以了解一下
    2021-12-12
  • Python標準庫之time庫的使用教程詳解

    Python標準庫之time庫的使用教程詳解

    這篇文章主要介紹了Python的time庫的使用教程,文中有非常詳細的代碼示例,對正在學習python基礎的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2022-04-04
  • pandas如何處理缺失值

    pandas如何處理缺失值

    這篇文章主要介紹了pandas如何處理缺失值,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • python多維數(shù)組分位數(shù)的求取方式

    python多維數(shù)組分位數(shù)的求取方式

    這篇文章主要介紹了python多維數(shù)組分位數(shù)的求取方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Python中l(wèi)ist列表添加元素的3種方法總結

    Python中l(wèi)ist列表添加元素的3種方法總結

    這篇文章主要介紹了Python中l(wèi)ist列表添加元素的3種方法總結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 中秋陰天看不見月亮只好用python寫賞月工具

    中秋陰天看不見月亮只好用python寫賞月工具

    女神約我去賞月!我一看中秋節(jié)可能會下雨,立馬用Python寫了款賞月工具!本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考價值,需要的朋友可以參考下
    2021-09-09
  • python裝飾器實例大詳解

    python裝飾器實例大詳解

    這篇文章主要介紹了python裝飾器實例大詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-10-10
  • Python中bytes和str的區(qū)別與聯(lián)系詳解

    Python中bytes和str的區(qū)別與聯(lián)系詳解

    Python3最重要的新特性之一是對字符串和二進制數(shù)據(jù)流做了明確的區(qū),下面這篇文章主要給大家介紹了關于Python中bytes和str區(qū)別與聯(lián)系的相關資料,需要的朋友可以參考下
    2022-05-05
  • PyTorch的安裝與使用示例詳解

    PyTorch的安裝與使用示例詳解

    本文介紹了熱門AI框架PyTorch的conda安裝方案,與簡單的自動微分示例,并順帶講解了一下PyTorch開源Github倉庫中的兩個Issue內容,需要的朋友可以參考下
    2024-05-05
  • python學生信息管理系統(tǒng)實現(xiàn)代碼

    python學生信息管理系統(tǒng)實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了python學生信息管理系統(tǒng)的實現(xiàn)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評論