五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動(dòng)態(tài)

Python中Scrapy+adbapi提高數(shù)據(jù)庫(kù)寫入效率實(shí)現(xiàn)

發(fā)布日期:2021-12-22 07:23 | 文章來源:站長(zhǎng)之家

一:twisted中的adbapi

​ 數(shù)據(jù)庫(kù)pymysql的commit()和execute()在提交數(shù)據(jù)時(shí),都是同步提交至數(shù)據(jù)庫(kù),由于scrapy框架數(shù)據(jù)的解析和異步多線程的,所以scrapy的數(shù)據(jù)解析速度,要遠(yuǎn)高于數(shù)據(jù)的寫入數(shù)據(jù)庫(kù)的速度。如果數(shù)據(jù)寫入過慢,會(huì)造成數(shù)據(jù)庫(kù)寫入的阻塞,影響數(shù)據(jù)庫(kù)寫入的效率。
使用twisted異步IO框架,實(shí)現(xiàn)數(shù)據(jù)的異步寫入,通過多線程異步的形式對(duì)數(shù)據(jù)進(jìn)行寫入,可以提高數(shù)據(jù)的寫入速度。

1.1 兩個(gè)主要方法

adbapi.ConnectionPool:

創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接池對(duì)象,其中包括多個(gè)連接對(duì)象,每個(gè)連接對(duì)象在獨(dú)立的線程中工作。adbapi只是提供了異步訪問數(shù)據(jù)庫(kù)的編程框架,再其內(nèi)部依然使MySQLdb這樣的庫(kù)訪問數(shù)據(jù)庫(kù)。

dbpool.runInteraction(do_insert,item):

異步調(diào)用do_insert函數(shù),dbpool會(huì)選擇連接池中的一個(gè)連接對(duì)象在獨(dú)立線程中調(diào)用insert_db,其中參數(shù)item會(huì)被傳給do_insert的第二個(gè)參數(shù),傳給do_insert的第一個(gè)參數(shù)是一個(gè)Transaction對(duì)象,其接口與Cursor對(duì)象類似,可以調(diào)用execute方法執(zhí)行SQL語句,do_insert執(zhí)行后,連接對(duì)象會(huì)自動(dòng)調(diào)用commit方法

1.2 使用實(shí)例

from twisted.enterprise import adbapi
# 初始化數(shù)據(jù)庫(kù)連接池(線程池)
# 參數(shù)一:mysql的驅(qū)動(dòng)
# 參數(shù)二:連接mysql的配置信息
dbpool = adbapi.ConnectionPool('pymysql', **params)
# 參數(shù)1:在異步任務(wù)中要執(zhí)行的函數(shù)insert_db;
# 參數(shù)2:給該函數(shù)insert_db傳遞的參數(shù)
query = self.dbpool.runInteraction(self.do_insert, item)
# 在execute()之后,不需要再進(jìn)行commit(),連接池內(nèi)部會(huì)進(jìn)行提交的操作。
def do_insert(self, cursor, item):
 insert_sql = """
insert into qa_sample( 
need_id, 
need_question_uptime, 
need_title, 
need_title_describe, 
need_answer_uptime, 
need_answer)
values (%s, %s, %s, %s, %s, %s)
"""
 params = (item['need_id'],
  item['need_question_uptime'],
  item['need_title'],
  item['need_title_describe'],
  item['need_answer_uptime'],
  item['need_answer'])
 cursor.execute(insert_sql, params)

二:結(jié)合scrapy中的pipelines

# -*- coding: utf-8 -*-
from twisted.enterprise import adbapi
import pymysql
 
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
 
 
class QaSpiderPipeline(object):
 def process_item(self, item, spider):
  return item
 
class MysqlTwistedPipeline(object):
 def __init__(self, dbpool):
  self.dbpool = dbpool
 
 @classmethod
 def from_settings(cls, settings):
  dbparams = dict(
host=settings['MYSQL_HOST'],
db=settings['MYSQL_DBNAME'],
user=settings['MYSQL_USER'],
passwd=settings['MYSQL_PASSWORD'],
charset='utf8',
cursorclass=pymysql.cursors.DictCursor,
use_unicode=True
  )
  dbpool = adbapi.ConnectionPool('pymysql', **dbparams)
  return cls(dbpool)
 
 def process_item(self, item, spider):
  query = self.dbpool.runInteraction(self.do_insert, item)
 
 def do_insert(self, cursor, item):
  insert_sql = """
 insert into qa_sample( 
 need_id, 
 need_question_uptime, 
 need_title, 
 need_title_describe, 
 need_answer_uptime, 
 need_answer)
 values (%s, %s, %s, %s, %s, %s)
 """
  params = (item['need_id'],
item['need_question_uptime'],
item['need_title'],
item['need_title_describe'],
item['need_answer_uptime'],
item['need_answer'])
  cursor.execute(insert_sql, params)

到此這篇關(guān)于Python中Scrapy+adbapi提高數(shù)據(jù)庫(kù)寫入效率實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Scrapy+adbapi數(shù)據(jù)庫(kù)寫入內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對(duì)1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部