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 ...