MySQL数据库的异步写入

2023-11-08

注意: 数据库pymysql的commit()和execute()在提交数据时,都是同步提交至数据库,由于scrapy框架数据的解析和异步多线程的,所以scrapy的数据解析速度,要远高于数据的写入数据库的速度。如果数据写入过慢,会造成数据库写入的阻塞,影响数据库写入的效率。
通过多线程异步的形式对数据进行写入,可以提高数据的写入速度。

使用twsited异步IO框架,实现数据的异步写入。


代码中参数格式:*代表是元组,**代表是字典(固定写法!非自定义!)

示例代码:

在settings.py中配置数据库参数,如下图:



# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

from scrapy.pipelines.images import ImagesPipeline
class JobbolePipeline(object):
    def process_item(self, item, spider):
        return item


# 定义处理图片的Pipeline
class ImagePipeline(ImagesPipeline):
    def item_completed(self, results, item, info):
        print('---',results)
        return item
        # 如果图片能够下载成功,说明这个文章是有图片的。如果results中不存在path路径,说明是没有图片的。
        # [(True, {'path': ''})]
        # if results:
        #     try:
        #         img_path = results[0][1]['path']
        #     except Exception as e:
        #         print('img_path获取异常,',e)
        #         img_path = '没有图片'
        # else:
        #     img_path = '没有图片'

        # 判断完成,需要将变量img_path重新保存到item中。


# 数据库pymysql的commit()和execute()在提交数据时,都是同步提交至数据库,由于scrapy框架数据的解析和异步多线程的,所以scrapy的数据解析速度,要远高于数据的写入数据库的速度。如果数据写入过慢,会造成数据库写入的阻塞,影响数据库写入的效率。
# 通过多线程异步的形式对数据进行写入,可以提高数据的写入速度。
from pymysql import cursors

# 使用twsited异步IO框架,实现数据的异步写入。
from twisted.enterprise import adbapi

class MySQLTwistedPipeline(object):
    """
        MYSQL_HOST = 'localhost'
        MYSQL_DB = 'jobbole'
        MYSQL_USER = 'root'
        MYSQL_PASSWD = '123456'
        MYSQL_CHARSET = 'utf8'
        MYSQL_PORT = 3306
    """
    def __init__(self, dbpool):
        self.dbpool = dbpool

    @classmethod
    def from_settings(cls, settings):
        params = dict(
            host=settings['MYSQL_HOST'],
            db=settings['MYSQL_DB'],
            user=settings['MYSQL_USER'],
            passwd=settings['MYSQL_PASSWD'],
            charset=settings['MYSQL_CHARSET'],
            port=settings['MYSQL_PORT'],
            cursorclass=cursors.DictCursor,
        )
        # 初始化数据库连接池(线程池)
        # 参数一:mysql的驱动
        # 参数二:连接mysql的配置信息
        dbpool = adbapi.ConnectionPool('pymysql', **params)
        return cls(dbpool)

    def process_item(self, item, spider):
        # 在该函数内,利用连接池对象,开始操作数据,将数据写入到数据库中。
        # pool.map(self.insert_db, [1,2,3])
        # 同步阻塞的方式: cursor.execute() commit()
        # 异步非阻塞的方式
        # 参数1:在异步任务中要执行的函数insert_db;
        # 参数2:给该函数insert_db传递的参数
        query = self.dbpool.runInteraction(self.insert_db, item)

        # 如果异步任务执行失败的话,可以通过ErrBack()进行监听, 给insert_db添加一个执行失败的回调事件
        query.addErrback(self.handle_error)

        return item

    def handle_error(self, field):
        print('-----数据库写入失败:',field)

    def insert_db(self, cursor, item):
        insert_sql = "INSERT INTO bole(title, date_time, tags, content, zan_num, keep_num, comment_num, img_src) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
        cursor.execute(insert_sql, (item['title'], item['date_time'], item['tags'], item['content'], item['zan_num'], item['keep_num'], item['comment_num'], item['img_src']))

        # 在execute()之后,不需要再进行commit(),连接池内部会进行提交的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL数据库的异步写入 的相关文章

随机推荐

  • 点云库PCL学习笔记 -- 输入输出IO -- 6.PCL中记录时间长度TicToc 类和系统Time 类

    点云库PCL学习笔记 输入输出IO 6 PCL中记录时间长度TicToc 类和系统Time 类 PCL库中用于记录时间长度的方法 第一种 TicToc 类的方法 添加头文件 include
  • pytorch(仅供自己参考勿看)

    一 安装Anaconda 下载pytorch前最好先安装Anaconda 可以按照以下方法下载 https blog csdn net weixin 50888378 article details 109022585 二 安装pytorc
  • 如何提高for循环的效率--兆易创新一面

    1 实例化变量放在循环外 include
  • 使用Lubuntu开发Android应用

    之前下了个ubuntu来编译Android源码并且开发App 后来发现桌面环境不太好用 而且32位Linux不能顺利编译Android源码 最近有空便重新下载Lubuntu 64位并配置好所有配置 其间颇多不顺 特记录下来 通过下面的步骤连
  • 8.1数据结构作业

    include
  • vue后台管理系统之日志管理模块

    前端的后台的日志管理模块功能的实现 使用的是elementUI框架 这是日志管理模块实现的效果图 div class log header div div div
  • error C2220: warning treated as error - no object file generated的处理方法

    很久以前在win2k DDK写的一个驱动 居然在2003ddk下编译不过去 真是奇怪 环境变量改为win2k 也不行 先是error C2220 warning treated as error no object file generat
  • 基于centos开发的server系统单机部署gp(rpm)

    1 下载安装包 rpm deb或源码 打开greenplum官网https github com greenplum db gpdb releases 下载安装包 或Greenplum Database Greenplum Database
  • 一个公式告诉你为什么程序员要转算法工程师

    原来的标题是 算法工程师工资调查 20170611 今天 2017年6月11日 爬了某招聘网站的十大城市的算法工程师职位 算法工程师 这里的算法工程师包括比较广泛 有做数据科学的 有做图形的 有做信号处理的 之后会统计更细分的领域 十大城市
  • 核酸预约地址查询结果查询小程序

    核酸检测报告结果查询 核酸检测 核酸检测预约 核酸 核酸检测查询 核酸检测报告 核酸检测结果 核酸检测地址导航 检测 核酸检测报告结果查询 核酸检测 核酸检测预约 核酸 核酸检测查询 核酸检测报告 核酸检测结果 核酸检测地址导航 检测 核酸
  • Go官方库RPC开发指南

    Go官方提供了一个RPC库 net rpc 包rpc提供了通过网络访问一个对象的方法的能力 服务器需要注册对象 通过对象的类型名暴露这个服务 注册后这个对象的输出方法就可以远程调用 这个库封装了底层传输的细节 包括序列化 服务器可以注册多个
  • 【多种优化算法比较】混沌引力搜索算法(CGSA)(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文献 1 概述 文献来源 自过去十年以来 启发式优化算法
  • 链表中环的入口结点--LeetCode第142题

    给一个链表 若其中包含环 请找出该链表的环的入口结点 否则 输出null 题解 快慢指针法 快指针一次走两步 慢指针一次走一步 当快慢指针第一次相遇 此时 2 x y n圈周长 x y 相遇以后快指针回到head和慢指针以同样速度每次走一步
  • 【springboot】yml的配置与获取数据:

    一 yml的配置 二 获取yml的配置数据
  • js工厂方法模式

    h1 给我一张名片 工厂方法模式 h1 p 工厂方法模式 Factory Method 通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例 p p 工厂方法模式本意是说将实际创建对象工作推迟到子类中 这样核心类就成了抽象类 Jav
  • R手册(NLP)--text2vec

    文章目录 分词器 I O 处理 迭代器 支持 create 函数 向量化 主题模型 text2vec 这个 R 包提供了高性能和简洁的 API 来进行文本分析 自然语言处理 分词器 word tokenizer strings 英语分词器
  • 如何从文件最后一行开始读取文件内容

    import java io import java util ArrayList 镜像图像 public class Solution public static void main String args throws Exceptio
  • adworld-EasyRE

    1 拿到exe文件 扔到exeinfo里面看一下 发现是32位无壳 2 扔到IDA里面 通过 shift F12 找字符串 发现 right 双击跟过去 发现sub 401080调用了这个字符串 跟过去 F5反编译 对于23行到30行的代码
  • nodejs(7)---中间件的使用

    中间件相当于过滤器模式 当前端发送信息到后端的时候 先经过中间件进行验证信息 再到后台调用接口获取数据 我们看看node中中间件怎么使用 一个中间件的完整形式是这样的 function demo middleware err req res
  • MySQL数据库的异步写入

    注意 数据库pymysql的commit 和execute 在提交数据时 都是同步提交至数据库 由于scrapy框架数据的解析和异步多线程的 所以scrapy的数据解析速度 要远高于数据的写入数据库的速度 如果数据写入过慢 会造成数据库写入