最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python流式游標與緩存式(默認)游標的那些坑及解決

 更新時間:2024年07月18日 09:17:38   作者:有人找你  
這篇文章主要介紹了Python流式游標與緩存式(默認)游標的那些坑及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一. 起因

本問題起源于自己在服務器大量解析圖片數據。

運行過程中出現錯誤:

(2013, 'Lost connection to MySQL server during query')

因為這個,我很認真的仔細的查了Mysql有關的timeout的問題:見“Mysql的timeout 以及 python重連”。

最后排查自己的問題不出在connect_time(兩個sql語句之間的等待時間),而在于我在不斷獲取下一排數據項(即調用fetchone()方法)中間進行大量耗時的工作,導致超過net_write_time而連接自動斷開。

原代碼:

	#這是一個類方法里面的內容,簡化版
  			sql = "select * from storys"
        try:
            # 獲取一個鏈接,一個cursor,執(zhí)行SQL語句,MysqlController為封裝的數據庫連接池處理工具
            conn = MysqlController.getConn()
            cursor = conn.cursor()
            cursor.execute(sql)

            #信號鎖
            semaphore = threading.BoundedSemaphore(self.maxRunThread)

            while(True):
                result = cursor.fetchone()
                if not result:
                    break
#這里不是重點
#———————————————————————————————————————————————————————————————————————————————————————————
                #這是一個for循環(huán),里面開啟了10個線程,每次開啟線程之前要求獲得到信號鎖。
  							#每個線程run方法結束之后會調用semaphore.release(),以此保證同時運行的線程不超過self.maxRunThread個
                for i in range(10):
                    semaphore.acquire()
                    t = threading.Thread(target=self.run, args=(semaphore,i))
                    t.start()
#———————————————————————————————————————————————————————————————————————————————————————————

            print('結束')
            cursor.close()
            conn.close()
        except Exception as e:
            print(e)

但是非常奇怪的是,盡管報錯Lost connection,但是我之后的數據依舊取到了,并完成分析了。

于是我做了一個小測試:

我預計取10個數據,在取第3個數據的時候,手動把連接斷開了。

按照我之前對fetchone()的理解,是每一次cursor在mysql中下移一個位置,返回給客戶端。

如果連接一旦斷開,cursor就不能獲取到數據了。

import pymysql
import time

def mytest():
    connection = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='',
    db='*******',
    charset='utf8')
    cursor = connection.cursor()
    cursor.execute("select * from storys limit 10")
    data = cursor.fetchone()
    i = 0
    while data != None:
        if(i == 3):
            connection.close()
            print('connection is close')
        print(data[0])
        i+=1
        data = cursor.fetchone()
    cursor.close()
    connection.close()

if __name__ == '__main__':
    mytest()

但是結果:

python3 run.py
23
24
25
connection is close
26
...

可以看見,手動關閉連接后,cursor依舊能取到數據。

最后結論:dbq,是我菜了,這個是假的fetchone。

二. 正事兒

經過查詢,python中的cursor主要分為兩大類:

非緩存式游標和緩存式游標。

cursor = connection.cursor()

這種方法默認的是緩存式游標,緩存式游標顧名思義,不管是fetchone還是fetchall都是在執(zhí)行語句的時候一次性返回所有數據到客戶端。

這種返回在數據量特別大的時候無疑是不利的,會占用大量內存,導致我的主機卡成ppt。

最正確的用法是使用非緩存式游標,即流式游標(SSCursor也可以):

cursor = conn.cursor(pymysql.cursors.SSDictCursor)#返回字典式數據

三. 小石子Warning

在查明白cursor的區(qū)別后,我非常開心的把游標換了。

但由于之前曾經處理過timeout的問題,我曾經非常多此一舉的在代碼里面添加過ping():

	#這是一個類方法里面的內容,簡化版
  			sql = "select * from storys"
        try:
            # 獲取一個鏈接,一個cursor,執(zhí)行SQL語句,MysqlController為封裝的數據庫連接池處理工具
            conn = MysqlController.getConn()
            cursor = conn.cursor(pymysql.cursors.SSDictCursor)#這里改游標類型了!?。。。。?!
            cursor.execute(sql)

            while(True):
              	conn.ping()# 就是這句話!?。。。。。。?!畫蛇添足!?。。。。?!正確代碼去掉這句話
                result = cursor.fetchone()
                if not result:
                    break
								#做了一些事兒

            print('結束')
            cursor.close()
            conn.close()
        except Exception as e:
            print(e)

要知道,在一個循環(huán)的不斷取數據的過程中,如果使用了ping就會使之前的查詢斷掉。

于是報錯:

UserWarning: Previous unbuffered result was left incomplete warnings.warn("Previous unbuffered result was left incomplete")

這個是由于查詢未完成而造成的,去掉ping就好了。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Hadoop中的Python框架的使用指南

    Hadoop中的Python框架的使用指南

    這篇文章主要介紹了Hadoop中的Python框架的使用指南,Hadoop一般使用復雜的Java操作,但通過該框架使得Python腳本操作Hadoop成為了可能,需要的朋友可以參考下
    2015-04-04
  • Python實現初始化不同的變量類型為空值

    Python實現初始化不同的變量類型為空值

    這篇文章主要介紹了Python實現初始化不同的變量類型為空值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 利用Python實現微信找房機器人實例教程

    利用Python實現微信找房機器人實例教程

    這篇文章主要給大家介紹了關于如何利用Python實現微信找房機器人的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-03-03
  • Python過濾txt文件內重復內容的方法

    Python過濾txt文件內重復內容的方法

    今天小編就為大家分享一篇Python過濾txt文件內重復內容的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python詞云展示庫wordcloud配置詳解

    Python詞云展示庫wordcloud配置詳解

    這篇文章主要介紹了Python詞云展示庫wordcloud配置詳解,詞云就是將詞語通過圖形可視化的方式,直觀和藝術的展示出來,詞云在我們的生活中經常能夠看到,無論是中文的詞云還是英文的詞云,需要的朋友可以參考下
    2023-07-07
  • Django ORM 常用字段與不常用字段匯總

    Django ORM 常用字段與不常用字段匯總

    這篇文章主要介紹了Django ORM 常用字段與不常用字段匯總,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • YOLOv5車牌識別實戰(zhàn)教程(七)實時監(jiān)控與分析

    YOLOv5車牌識別實戰(zhàn)教程(七)實時監(jiān)控與分析

    這篇文章主要介紹了YOLOv5車牌識別實戰(zhàn)教程(七)實時監(jiān)控與分析,在這個教程中,我們將一步步教你如何使用YOLOv5進行車牌識別,幫助你快速掌握YOLOv5車牌識別技能,需要的朋友可以參考下
    2023-04-04
  • Python求1到n的階乘之和的實例

    Python求1到n的階乘之和的實例

    這篇文章主要介紹了Python求1到n的階乘之和的實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Python編程實現雙擊更新所有已安裝python模塊的方法

    Python編程實現雙擊更新所有已安裝python模塊的方法

    這篇文章主要介紹了Python編程實現雙擊更新所有已安裝python模塊的方法,涉及Python針對模塊操作命令的相關封裝與調用技巧,需要的朋友可以參考下
    2017-06-06
  • Python 統(tǒng)計列表中重復元素的個數并返回其索引值的實現方法

    Python 統(tǒng)計列表中重復元素的個數并返回其索引值的實現方法

    這篇文章主要介紹了Python 統(tǒng)計列表中重復元素的個數并返回其索引值,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05

最新評論

奈曼旗| 长寿区| 丽水市| 铜川市| 苍梧县| 武清区| 神木县| 博客| 大丰市| 汝阳县| 全州县| 江永县| 绥宁县| 伊春市| 科尔| 石狮市| 镶黄旗| 三明市| 丰都县| 北宁市| 新建县| 阳春市| 威远县| 太谷县| 嵊州市| 安阳市| 高密市| 长寿区| 枞阳县| 郑州市| 奈曼旗| 石棉县| 阳高县| 莱州市| 大同县| 汤阴县| 清原| 株洲县| 平舆县| 中西区| 政和县|