亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Python3 多線程(連接池)操作MySQL插入數據

Python3 多線程(連接池)操作MySQL插入數據

熱門標簽:南陽打電話機器人 地圖標注自己和別人標注區別 ai電銷機器人的優勢 孝感營銷電話機器人效果怎么樣 打電話機器人營銷 聊城語音外呼系統 海外網吧地圖標注注冊 騰訊地圖標注沒法顯示 商家地圖標注海報

多線程(連接池)操作MySQL插入數據

針對于此篇博客的收獲心得:

  • 首先是可以構建連接數據庫的連接池,這樣可以多開啟連接,同一時間連接不同的數據表進行查詢,插入,為多線程進行操作數據庫打基礎
  • 多線程根據多連接的方式,需求中要完成多語言的入庫操作,我們可以啟用多線程對不同語言數據進行并行操作
  • 在插入過程中,一條一插入,比較浪費時間,我們可以把數據進行積累,積累到一定的條數的時候,執行一條sql命令,一次性將多條數據插入到數據庫中,節省時間cur.executemany

1.主要模塊

DBUtils : 允許在多線程應用和數據庫之間連接的模塊套件
Threading : 提供多線程功能

2.創建連接池

PooledDB 基本參數:

  • mincached : 最少的空閑連接數,如果空閑連接數小于這個數,Pool自動創建新連接;
  • maxcached : 最大的空閑連接數,如果空閑連接數大于這個數,Pool則關閉空閑連接;
  • maxconnections : 最大的連接數;
  • blocking : 當連接數達到最大的連接數時,在請求連接的時候,如果這個值是True,請求連接的程序會一直等待,直到當前連接數小于最大連接數,如果這個值是False,會報錯;
def mysql_connection():
    maxconnections = 15  # 最大連接數
    pool = PooledDB(
        pymysql,
        maxconnections,
        host='localhost',
        user='root',
        port=3306,
        passwd='123456',
        db='test_DB',
        use_unicode=True)
    return pool

# 使用方式
pool = mysql_connection()
con = pool.connection()

3.數據預處理

文件格式:txt

共準備了四份虛擬數據以便測試,分別有10萬, 50萬, 100萬, 500萬行數據

MySQL表結構如下圖:

數據處理思路 :

  • 每一行一條記錄,每個字段間用制表符 “\t” 間隔開,字段帶有雙引號;
  • 讀取出來的數據類型是 Bytes ;
  • 最終得到嵌套列表的格式,用于多線程循環每個任務每次處理10萬行數據;

格式 : [ [(A,B,C,D), (A,B,C,D),(A,B,C,D),…], [(A,B,C,D), (A,B,C,D),(A,B,C,D),…], [], … ]

import re
import time

st = time.time()
with open("10w.txt", "rb") as f:
    data = []
    for line in f:
        line = re.sub("\s", "", str(line, encoding="utf-8"))
        line = tuple(line[1:-1].split("\"\""))
        data.append(line)
    n = 100000  # 按每10萬行數據為最小單位拆分成嵌套列表
    result = [data[i:i + n] for i in range(0, len(data), n)]
print("10萬行數據,耗時:{}".format(round(time.time() - st, 3)))

# 10萬行數據,耗時:0.374
# 50萬行數據,耗時:1.848
# 100萬行數據,耗時:3.725
# 500萬行數據,耗時:18.493

4.線程任務

每調用一次插入函數就從連接池中取出一個鏈接操作,完成后關閉鏈接;
executemany 批量操作,減少 commit 次數,提升效率;

def mysql_insert(*args):
    con = pool.connection()
    cur = con.cursor()
    sql = "INSERT INTO test(sku,fnsku,asin,shopid) VALUES(%s, %s, %s, %s)"
    try:
        cur.executemany(sql, *args)
        con.commit()
    except Exception as e:
        con.rollback()  # 事務回滾
        print('SQL執行有誤,原因:', e)
    finally:
        cur.close()
        con.close()

5.啟動多線程

代碼思路 :

設定最大隊列數,該值必須要小于連接池的最大連接數,否則創建線程任務所需要的連接無法滿足,會報錯 : pymysql.err.OperationalError: (1040, ‘Too many connections')循環預處理好的列表數據,添加隊列任務如果達到隊列最大值 或者 當前任務是最后一個,就開始多線程隊執行隊列里的任務,直到隊列為空;

def task():
    q = Queue(maxsize=10)  # 設定最大隊列數和線程數
    # data : 預處理好的數據(嵌套列表)
    while data:
        content = data.pop()
        t = threading.Thread(target=mysql_insert, args=(content,))
        q.put(t)
        if (q.full() == True) or (len(data)) == 0:
            thread_list = []
            while q.empty() == False:
                t = q.get()
                thread_list.append(t)
                t.start()
            for t in thread_list:
                t.join()

6.完整示例

import pymysql
import threading
import re
import time
from queue import Queue
from DBUtils.PooledDB import PooledDB

class ThreadInsert(object):
    "多線程并發MySQL插入數據"
    def __init__(self):
        start_time = time.time()
        self.pool = self.mysql_connection()
        self.data = self.getData()
        self.mysql_delete()
        self.task()
        print("========= 數據插入,共耗時:{}'s =========".format(round(time.time() - start_time, 3)))
        
    def mysql_connection(self):
        maxconnections = 15  # 最大連接數
        pool = PooledDB(
            pymysql,
            maxconnections,
            host='localhost',
            user='root',
            port=3306,
            passwd='123456',
            db='test_DB',
            use_unicode=True)
        return pool

    def getData(self):
        st = time.time()
        with open("10w.txt", "rb") as f:
            data = []
            for line in f:
                line = re.sub("\s", "", str(line, encoding="utf-8"))
                line = tuple(line[1:-1].split("\"\""))
                data.append(line)
        n = 100000    # 按每10萬行數據為最小單位拆分成嵌套列表
        result = [data[i:i + n] for i in range(0, len(data), n)]
        print("共獲取{}組數據,每組{}個元素.==>> 耗時:{}'s".format(len(result), n, round(time.time() - st, 3)))
        return result

    def mysql_delete(self):
        st = time.time()
        con = self.pool.connection()
        cur = con.cursor()
        sql = "TRUNCATE TABLE test"
        cur.execute(sql)
        con.commit()
        cur.close()
        con.close()
        print("清空原數據.==>> 耗時:{}'s".format(round(time.time() - st, 3)))

    def mysql_insert(self, *args):
        con = self.pool.connection()
        cur = con.cursor()
        sql = "INSERT INTO test(sku, fnsku, asin, shopid) VALUES(%s, %s, %s, %s)"
        try:
            cur.executemany(sql, *args)
            con.commit()
        except Exception as e:
            con.rollback()  # 事務回滾
            print('SQL執行有誤,原因:', e)
        finally:
            cur.close()
            con.close()

    def task(self):
        q = Queue(maxsize=10)  # 設定最大隊列數和線程數
        st = time.time()
        while self.data:
            content = self.data.pop()
            t = threading.Thread(target=self.mysql_insert, args=(content,))
            q.put(t)
            if (q.full() == True) or (len(self.data)) == 0:
                thread_list = []
                while q.empty() == False:
                    t = q.get()
                    thread_list.append(t)
                    t.start()
                for t in thread_list:
                    t.join()
        print("數據插入完成.==>> 耗時:{}'s".format(round(time.time() - st, 3)))

if __name__ == '__main__':
    ThreadInsert()

插入數據對比

共獲取1組數據,每組100000個元素.== >> 耗時:0.374's
清空原數據.== >> 耗時:0.031's
數據插入完成.== >> 耗時:2.499's
=============== 10w數據插入,共耗時:3.092's ===============
共獲取5組數據,每組100000個元素.== >> 耗時:1.745's
清空原數據.== >> 耗時:0.0's
數據插入完成.== >> 耗時:16.129's
=============== 50w數據插入,共耗時:17.969's ===============
共獲取10組數據,每組100000個元素.== >> 耗時:3.858's
清空原數據.== >> 耗時:0.028's
數據插入完成.== >> 耗時:41.269's
=============== 100w數據插入,共耗時:45.257's ===============
共獲取50組數據,每組100000個元素.== >> 耗時:19.478's
清空原數據.== >> 耗時:0.016's
數據插入完成.== >> 耗時:317.346's
=============== 500w數據插入,共耗時:337.053's ===============

7.思考/總結

思考 :多線程+隊列的方式基本能滿足日常的工作需要,但是細想還是有不足;
例子中每次執行10個線程任務,在這10個任務執行完后才能重新添加隊列任務,這樣會造成隊列空閑.如剩余1個任務未完成,當中空閑數 9,當中的資源時間都浪費了;
是否能一直保持隊列飽滿的狀態,每完成一個任務就重新填充一個.

 到此這篇關于Python3 多線程(連接池)操作MySQL插入數據的文章就介紹到這了,更多相關Python3 多線程插入MySQL數據內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python3 操作 MySQL 插入一條數據并返回主鍵 id的實例
  • python3實現往mysql中插入datetime類型的數據
  • 使用python3 實現插入數據到mysql
  • 解決python3插入mysql時內容帶有引號的問題
  • python3 pandas 讀取MySQL數據和插入的實例
  • Python3.6-MySql中插入文件路徑,丟失反斜杠的解決方法

標簽:聊城 楊凌 撫州 牡丹江 揚州 迪慶 六盤水 南寧

巨人網絡通訊聲明:本文標題《Python3 多線程(連接池)操作MySQL插入數據》,本文關鍵詞  Python3,多,線程,連接,池,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python3 多線程(連接池)操作MySQL插入數據》相關的同類信息!
  • 本頁收集關于Python3 多線程(連接池)操作MySQL插入數據的相關信息資訊供網民參考!
  • 推薦文章
    日本伦理网站| 欧美另类videosbestsex高清| 精品国产一区二区三区国产馆| 香蕉视频一级| 欧美激情影院| 可以免费看毛片的网站| 黄色免费网站在线| 九九九国产| 日本乱中文字幕系列| 香蕉视频一级| 色综合久久手机在线| 你懂的在线观看视频| 成人免费观看的视频黄页| 亚洲精品中文一区不卡| 美国一区二区三区| 精品视频免费在线| 欧美日本二区| 欧美另类videosbestsex视频| 成人免费网站视频ww| 国产a免费观看| 亚洲 激情| 成人影院一区二区三区| 99久久精品国产高清一区二区 | 国产一区二区精品| 国产韩国精品一区二区三区| 黄色短视频网站| 成人高清免费| 日韩在线观看视频免费| 欧美大片毛片aaa免费看| 日韩avdvd| 毛片高清| 亚洲 激情| 欧美激情一区二区三区视频高清| 亚洲天堂一区二区三区四区| 亚洲天堂一区二区三区四区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久精品免视看国产成人2021| 国产精品自拍亚洲| 欧美18性精品| 四虎论坛| 日韩一级精品视频在线观看| 精品视频在线观看一区二区三区| 九九免费高清在线观看视频| 欧美国产日韩一区二区三区| 亚洲女人国产香蕉久久精品| 精品国产香蕉伊思人在线又爽又黄| 高清一级片| 亚洲第一色在线| 91麻豆精品国产综合久久久| 精品视频免费观看| 国产视频久久久久| 成人免费观看男女羞羞视频| 亚洲第一色在线| 亚洲www美色| 一级毛片看真人在线视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产高清视频免费| 亚洲第一页乱| 亚洲精品中文一区不卡| 99久久精品国产国产毛片| 欧美国产日韩在线| 久久99爰这里有精品国产| 精品视频免费观看| 国产一区国产二区国产三区| 亚洲爆爽| 日韩avdvd| 日韩男人天堂| 99久久网站| 国产国语在线播放视频| 久久久久久久网| 一级女性大黄生活片免费| 91麻豆爱豆果冻天美星空| 韩国三级视频网站| 亚洲 男人 天堂| 成人免费一级毛片在线播放视频| 成人高清视频免费观看| 午夜欧美成人久久久久久| 国产福利免费视频| 久草免费在线视频| 九九精品影院| 91麻豆精品国产自产在线观看一区| 久久精品欧美一区二区| 91麻豆国产福利精品| 久草免费在线色站| 日本免费看视频| 成人免费高清视频| 国产成人精品综合在线| 国产91精品一区二区| 黄视频网站免费观看| 欧美激情一区二区三区视频| 91麻豆精品国产高清在线| 精品久久久久久中文字幕2017| 免费毛片播放| 成人高清视频免费观看| 99色视频在线| 欧美a免费| 韩国三级视频网站| 国产成人啪精品| 午夜在线亚洲| 亚洲天堂免费观看| 韩国三级香港三级日本三级| 韩国妈妈的朋友在线播放| 欧美大片a一级毛片视频| 日本免费乱理伦片在线观看2018| 精品国产一区二区三区久久久狼| 99热热久久| 麻豆系列 在线视频| 麻豆网站在线看| 日韩欧美一二三区| 一级女性大黄生活片免费| 国产极品精频在线观看| 精品视频在线看 | 亚洲精品中文一区不卡| 色综合久久天天综合观看| 欧美a级成人淫片免费看| 亚欧视频在线| 国产高清在线精品一区二区 | 欧美大片一区| 色综合久久天天综合绕观看| 国产网站在线| 中文字幕Aⅴ资源网| 国产精品1024永久免费视频| 青青久热| 国产不卡在线看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产不卡高清在线观看视频| 毛片高清| 一级毛片视频在线观看| 国产韩国精品一区二区三区| 99久久精品国产高清一区二区 | 99久久网站| 美女免费黄网站| 美女免费毛片| 国产成人精品在线| 精品久久久久久中文字幕2017| 日本伦理黄色大片在线观看网站| 999久久66久6只有精品| 欧美一区二区三区在线观看| 日韩在线观看免费完整版视频| 亚洲第一视频在线播放| 香蕉视频久久| 99久久精品国产高清一区二区| 毛片高清| 成人影院久久久久久影院| 国产伦精品一区二区三区在线观看| 九九精品在线播放| 欧美激情一区二区三区视频 | 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产不卡精品一区二区三区| 国产麻豆精品| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 久久99青青久久99久久| 精品久久久久久影院免费| 你懂的日韩| 久久精品大片| 国产网站免费在线观看| 四虎精品在线观看| 99色视频在线| 国产网站在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品毛片视频| 国产美女在线一区二区三区| 精品国产三级a| 91麻豆精品国产高清在线| a级毛片免费观看网站| 午夜激情视频在线播放| 欧美国产日韩一区二区三区| 精品久久久久久综合网| 国产高清在线精品一区二区 | 精品国产一区二区三区久| 欧美一区二区三区在线观看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 一级片片| 韩国毛片免费大片| 欧美电影免费| 国产国语对白一级毛片| 99热精品一区| 久久国产影视免费精品| 日韩中文字幕一区二区不卡| 色综合久久久久综合体桃花网| 九九精品久久| 中文字幕Aⅴ资源网| 四虎精品在线观看| 国产网站免费在线观看| 天天色色网| 国产视频一区在线| 四虎论坛| 九九热精品免费观看| 精品国产一区二区三区免费| 一级女性全黄久久生活片| 精品在线视频播放| 精品国产亚洲一区二区三区| 国产伦精品一区二区三区在线观看| 欧美激情在线精品video| 欧美激情一区二区三区在线播放| 精品久久久久久影院免费| 九九九在线视频| 亚洲天堂免费| 国产亚洲精品成人a在线| 久久久久久久免费视频|