python同程爬取之sql连接池,多线程锁

由于该项目还在运行当中,公司并未使用代理,此处只贴逻辑,关键代码我会打码,见谅

配置:

from DBUtils.PooledDB import PooledDB###sql连接池的一个包
import requests
import re
import time
import random
import json
import pymysql
from lxml import etree
import threading
b ={"user":"***",
    "passwd":"***",
    "host":"****",
    "db":'*****',
    "port":****,
    "charset":'utf8'####解决中文编码
}
h=0####全局参数,城市数,由于线程并发争抢资源的问题,故需锁住

数据库部分:###init游标,封装线程池,sql查询,sql增删改

class Braud(threading.Thread):###继承线程类
    __pool=None
    _instance_lock = threading.Lock()
    ##初始化一些资源
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        ##接下来三个参数应为并没有处理记录线程情况作用不大
        self.threadID = threadID
        self.name = name
        self.counter = counter
        ###时间
        self.indata="2018-09-14"
        self.outdata="2018-09-15"
        #将数据库连接游标初始化,这个游标通过连接池中的连接每一次sql都是不同的连接
        self.coon=Braud.getmysqlconn()
        self.cur=self.coon.cursor(cursor=pymysql.cursors.DictCursor)

    #sql连接池,init游标,此处与游标建立了联系达到全局都可以使用这个池子,即每条sql语句通过游标建立一个单独的连接
    @staticmethod
    def getmysqlconn():
        if Braud.__pool is None:
	        #creater是以哪种包来创建pool,
	        #mincached最少的空闲连接数,如果空闲连接数小于这个数,pool会创建一个新的连接
	        #maxcached最大的空闲连接数,如果空闲连接数大于这个数,pool会关闭空闲连接
	        #当然这个包还有其他的东西:[精炼](https://www.cnblogs.com/Xjng/p/3437694.html)
            __pool=PooledDB(creator=pymysql,mincached=3,maxcached=20,host=b["host"],user=b["user"],passwd=b["passwd"],db=b["db"],port=b["port"],charset=b["charset"])
        return __pool.connection()

    # 插入\更新\删除sql\##此处有个问题就是传一个sql,value是不能直接生成sql语句,所以单独写对应写入函数来拼接sql语句
    def op_insert(self, sql):
        
        print('op_insert', sql)
        insert_num = self.cur.execute(sql)
        print("修改成功")
        self.coon.commit()
        return insert_num
       
    # 查询
    def op_select(self, sql):
        try:
            print('op_select', sql)
            self.cur.execute(sql)  # 执行sql
            select_res = self.cur.fetchall()  # 返回结果为字典
            print("查询成功")
            return select_res
        except pymysql.Error as e:
            self.op_select(sql)

    # 释放资源,此处我是加到所有线程结束,释放,并没有实测(开始是没加此函数)
    def dispose(self):
        self.coon.close()
        self.cur.close()

线程run方法,此方法名称不能改,为线程模块中默认跑线程start只是开启

#多线程:城市每10条一取最大633个
    def run(self):
        global h
        while True:
	        #在这个所得前后必须将终止条件都写一遍,不然就会有几个线程在达到终止条件但并不会停止
            if h >640:
                break
            with Booking._instance_lock:
                x = h
                if h>630:
                    x=633
                h += 10
            if h >640:
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值