国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 詳解多線程Django程序耗盡數據庫連接的問題

詳解多線程Django程序耗盡數據庫連接的問題

2021-04-05 00:37賴勇浩 Python

這篇文章主要介紹了多線程Django程序耗盡數據庫連接的問題,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Django的ORM是非常好用的,哪怕不是做Web項目也值得一用,所以網上也可以找到不少使用 Django 開發非Web項目的資料,因為除了ORM之個,命令行、配置文件等組件也非常好用。

最近用這種方式開發了一個非Web項目,而且是多線程的。有N個工作線程從DB中獲取jobs,并把結果寫回DB。簡單來說就是這樣。

項目運行一段時間后,發現數據庫連接耗盡了,幸好內存大,然后一直往上調,最后連接數都上九千多一萬了。耗盡連接數的時候,PostgreSQL 會出現類似這樣的錯誤:

FATAL: remaining connection slots are reserved for non-replication superuser connections

然后就各種看文檔、代碼,找問題,其中艱難略下不表,最后大概是這么些個知識點:

  1. Django里的數據庫連接是放在線程的 local() 實例中的。
  2. 任何時候,需要一個數據庫連接的話,Django就會創建一條出來,或者用本線程已有的那條。
  3. 如果是Web項目,在請求結束的時候,Django會去關閉掉連接。是的,沒有連接池。
  4. 因為我們是非Web項目,所以不存在請求結束事件,所以一直沒的關閉連接。但本來這個應該也不會造成問題的,因為沒關閉就一直用唄,但不知道哪里出了問題,會出現連接泄漏,所以連接數據會一直增長。

最后的解決方案是找時機主動關閉數據庫連接,具體到我們項目,就是每次工作線程完成一個任務后,就把它相關的連接關掉,因為我們用的是 ThreadPoolExecutor ,所以Django很容易做到這一點。

重點代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
from django.db import connections
 
def on_done(future):
  # 因為每一個線程都有一個 connections,所以這里可以調用 close_all(),把本線程名下的所有連接關閉。
  connections.close_all()
 
def main():
  # ...
  with ThreadPoolExecutor() as executor:
    while True:
      future = executor.submit(do, get_a_job())
      future.add_done_callback(on_done)

主動關閉后,數據庫連接數降到與工作線程數相近,并保持穩定。

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

原文鏈接:https://blog.csdn.net/gzlaiyonghao/article/details/82959426

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久综合九色综合欧美狠狠 | 91精品国产综合久久婷婷香蕉 | 欧美精品久久 | 色欧美日韩| 性色av一区二区三区红粉影视 | 免费观看特级毛片 | 国产精品国产三级国产aⅴ中文 | av中文字幕在线 | 国产综合免费视频 | 久久免费电影 | 亚洲免费视频在线观看 | 国产探花在线精品一区二区 | 国产精品久久一区二区三区 | 中文字幕一区二区三区四区 | 免费观看一级毛片 | 国内激情自拍 | 亚洲在线视频 | 亚洲久草| 99精品欧美一区二区三区 | 无码日韩精品一区二区免费 | 一区高清 | 国产日韩欧美三级 | 国内精品一区二区 | www,四虎 | 国产第一区二区三区 | 亚洲毛片在线 | 中文字幕在线免费 | jav久久亚洲欧美精品 | 色花av | 91嫩草香蕉 | 欧美一区在线看 | 中文字幕在线一区 | 成人免费乱码大片a毛片软件 | 久久久久高清 | 日本在线不卡视频 | 国产日韩精品一区 | 久久99久久99精品免观看粉嫩 | 欧美一区三区 | 中文精品在线观看 | 在线视频不卡一区 | 玖玖爱视频在线 |