python 多執行緒佇列任務往mysql寫資料

2021-10-07 16:17:44 字數 2569 閱讀 8939

import pymysql

import threading

import re

import time

from queue import queue

from dbutils.pooleddb import pooleddb

class threadinsert(object):

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='127.0.0.1',

user='root',

port=3306,

passwd='',

db='hua',

use_unicode=true)

return pool

# 從本地的檔案中讀取資料

def getdata(self):

st = time.time()

with open("e:\多執行緒插入資料庫\\user2.txt", "rb") as f:

data =

for line in f:

line = re.sub("\s", "", str(line, encoding="utf-8"))

line = tuple(line[1:-1].split("\"\""))

n = 1000 # 按每1000行資料為最小單位拆分成巢狀列表,可以根據實際情況拆分

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_table"

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_table(name) values(%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()

t.start()

for t in thread_list:

t.join()

print("資料插入完成.==>> 耗時:{}'s".format(round(time.time() - st, 3)))

if __name__ == '__main__':

threadinsert()

python佇列執行緒池 Python多執行緒與佇列

多執行緒爬蟲對比單執行緒爬蟲有很大的優勢,雖然python中的多執行緒並不是真正意義上的多執行緒,執行緒不可以同時執行,而是順序序列執行的,只是在乙個執行緒在等待時,cpu切換到另外乙個執行緒接著幹活,這樣看起來就感覺像是並行。雖然如此,多執行緒的效率仍然比單執行緒快上很多倍,是爬蟲中不可缺少的技能...

Python 執行緒池 佇列任務

現在又佇列長度為n的乙個任務佇列需要處理,同時處理的任務數目為m,如何處理 python3中threading.thread 執行緒,通過start 方法來啟動,較為簡單的方法就是開始m個任務,m個任務都結束,再執行下一批m個任務,這裡就用到了 futures 其中又executor.submit ...

Python 多執行緒 佇列爬蟲

python 多執行緒 佇列,爬蟲例子 coding utf 8 import urllib2 import urllib import json import time import datetime import threading import queue import sys reload ...