Python3多线程写数据库

123 篇文章 4 订阅
57 篇文章 1 订阅
import pymysql
import threading

class Db:
    def __init__(self, host=None, username=None, pwd=None, dbname=None):
        self.pool = {}
        self.host = host
        self.username = username
        self.pwd = pwd
        self.dbname = dbname

    def get_instance(self):
    	# 在连接池中为每个线程创建连接,并从连接池中获取连接
        name = threading.current_thread().name
        if name not in self.pool:
            conn = pymysql.connect(self.host, self.username, self.pwd, self.dbname)
            self.pool[name] = conn
        return self.pool[name]

class MultiThreads:
    def __init__(self, host=None, username=None, pwd=None, dbname=None):
        self.max_id = 10000
        self.start_id = 1
        self.db = Db(host, username, pwd, dbname)
        self.lock = threading.Lock()

    def insert_data(self):
        db = self.db.get_instance()
        cursor = db.cursor()
        while True:
            if self.start_id >= self.max_id:
                break
            s = self.start_id
            # 线程锁
            with self.lock:
                self.start_id += 50
                if self.start_id > self.max_id:
                    self.start_id = self.max_id
            e = self.start_id
            for i in range(s, e):
                sql = "insert into xxxxxx (id, name) values('{}', '{}')".format(i, threading.current_thread().name)
                try:
                    cursor.execute(sql)
                    db.commit()
                    print(threading.current_thread().name, ': ', sql, ': success')
                except:
                    db.rollback()
                    print(threading.current_thread().name, ': ', sql, ':failed')
                    raise

def main():
    multi_threads = MultiThreads('xxxxxxx', 'xxxxx', 'xxxxx', 'xxxxxx')
    threads = []
    # 150为线程数量
    for i in range(150):
        t = threading.Thread(target=multi_threads.insert_data)
        t.start()
        threads.append(t)
    for t in threads:
        t.join()

if __name__ == '__main__':
    main()

该示例代码运行需要mysql数据库,修改其中关于数据库连接参数以及表的参数即可运行
结果:
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值