python协程池操作mysql_python_协程方式操作数据库
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import requests
import gevent
import pymysql
from gevent import monkey
# 堵塞标记
monkey.patch_all()
class SqlSave(object):
"""协程方式写入数据库"""
def __init__(self):
SQL_DBA = {
‘host‘: ‘localhost‘,
‘db‘: ‘jobole‘,
‘user‘: ‘root‘,
‘password‘: ‘jiayuan95814‘,
‘use_unicode‘: True,
‘charset‘: ‘utf8‘
}
self.conn = pymysql.connect(**SQL_DBA)
self.cursor = self.conn.cursor()
def process_item(self):
sql = self.__get_sql()
print(sql)
# 协程对数据库操作
gevent.joinall([
gevent.spawn(self.__go_sql, sql),
])
def __go_sql(self, sql):
self.cursor.execute(sql)
self.conn.commit()
def __get_sql(self):
# 测试数据
return """insert into article(cont_id, cont_url, title, publish_time, cont, img_url, img_path, like_num, collection_num, comment_num) value (‘d374f2fc6bd013a58513687fe2fe4e97‘,‘http://blog.jobbole.com/111866/‘,‘DB 分库分表(2):全局主键生成策略‘,‘2017-07-16‘,‘原文出处:Laurence的技术博客本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案。关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:DB 分库分表(1):拆分实施策略和示例演示第一部分:一些常见的主键生成策略一旦数据库被切分到多个物理结点上,我们将不能再依赖数据库自身的主键生成机制。一方面,某个分区数据库自生成的ID无法保证在全局上是唯一的;另一方面,应用程序在插入数据之前需要先获得ID,以便进行SQL路由。目前几种可行的主键生成策略有:1. UUID:使用UUID作主键是最简单的方案,但是缺点也是非常明显的。由于UUID非常的长,除占用大量存储空间外,最主要的问题是在索引上,在建立索引和基于索引进行查询时都存在性能问题。2. 结合数据库维护一个Sequence表:此方案的思路也很简单,在数据库中建立一个Sequence表,表的结构类似于:CREATE TABLE `SEQUENCE` (
`tablename` varchar(30) NOT NULL,
`nextid` bigint(20) NOT NULL,
PRIMARY KEY (`tablename`)
) ENGINE=InnoDB12345CREATETABLE`SEQUENCE`(`tablename`varchar(30)NOTNULL,`nextid`bigint(20)NOTNULL,PRIMARYKEY(`tablename`))ENGINE=InnoDB每当需要为某个表的新纪录生成ID时就从Sequence表中取出对应表的nextid,并将nextid的值加1后更新到数据库中以备下次使用。此方案也较简单,但缺点同样明显:由于所有插入任何都需要访问该表,该表很容易成为系统性能瓶颈,同时它也存在单点问题,一旦该表数据库失效,整个应用程序将无法工作。有人提出使用Master-Slave进行主从同步,但这也只能解决单点问题,并不能解决读写比为1:1的访问压力问题。除此之外,还有一些方案,像对每个数据库结点分区段划分ID,以及网上的一些ID生成算法,因为缺少可操作性和实践检验,本文并不推荐。实际上,接下来,我们要介绍的是Fickr使用的一种主键生成方案,这个方案是目前我所知道的最优秀的一个方案,并且经受了实践的检验,可以为大多数应用系统所借鉴。第二部分:一种极为优秀的主键生成策略flickr开发团队在2010年撰文介绍了flickr使用的一种主键生成测策略,同时表示该方案在flickr上的实际运行效果也非常令人满意,原文连接:Ticket Servers: Distributed Unique Primary Keys on the Cheap这个方案是我目前知道的最好的方案,它与一般Sequence表方案有些类似,但却很好地解决了性能瓶颈和单点问题,是一种非常可靠而高效的全局主键生成方案。图1. flickr采用的sharding主键生成方案示意图(点击查看大图)flickr这一方案的整体思想是:建立两台以上的数据库ID生成服务器,每个服务器都有一张记录各表当前ID的Sequence表,但是Sequence中ID增长的步长是服务器的数量,起始值依次错开,这样相当于把ID的生成散列到了每个服务器节点上。例如:如果我们设置两台数据库ID生成服务器,那么就让一台的Sequence表的ID起始值为1,每次增长步长为2,另一台的Sequence表的ID起始值为2,每次增长步长也为2,那么结果就是奇数的ID都将从第一台服务器上生成,偶数的ID都从第二台服务器上生成,这样就将生成ID的压力均匀分散到两台服务器上,同时配合应用程序的控制,当一个服务器失效后,系统能自动切换到另一个服务器上获取ID,从而保证了系统的容错。关于这个方案,有几点细节这里再说明一下:1. flickr的数据库ID生成服务器是专用服务器,服务器上只有一个数据库,数据库中表都是用于生成Sequence的,这也是因为auto-increment-offset和auto-increment-increment这两个数据库变量是数据库实例级别的变量。2. flickr的方案中表格中的stub字段只是一个char(1) NOT NULL存根字段,并非表名,因此,一般来说,一个Sequence表只有一条纪录,可以同时为多张表生成ID,如果需要表的ID是有连续的,需要为该表单独建立Sequence表。3. 方案使用了MySQL的LAST_INSERT_ID()函数,这也决定了Sequence表只能有一条记录。4. 使用REPLACE INTO插入数据,这是很讨巧的作法,主要是希望利用mysql自身的机制生成ID,不仅是因为这样简单,更是因为我们需要ID按照我们设定的方式(初值和步长)来生成。5. SELECT LAST_INSERT_ID()必须要于REPLACE INTO语句在同一个数据库连接下才能得到刚刚插入的新ID,否则返回的值总是06. 该方案中Sequence表使用的是MyISAM引擎,以获取更高的性能,注意:MyISAM引擎使用的是表级别的锁,MyISAM对表的读写是串行的,因此不必担心在并发时两次读取会得到同一个ID(另外,应该程序也不需要同步,每个请求的线程都会得到一个新的connection,不存在需要同步的共享资源)。经过实际对比测试,使用一样的Sequence表进行ID生成,MyISAM引擎要比InnoDB表现高出很多!7. 可使用纯JDBC实现对Sequence表的操作,以便获得更高的效率,实验表明,即使只使用springJDBC性能也不及纯JDBC来得快!实现该方案,应用程序同样需要做一些处理,主要是两方面的工作:1. 自动均衡数据库ID生成服务器的访问2. 确保在某个数据库ID生成服务器失效的情况下,能将请求转发到其他服务器上执行。1赞收藏评论‘,‘http://jbcdn2.b0.upaiyun.com/2017/03/4bae6998d00f180d42c7da716e3d0bb2.jpg‘,‘full/117976068e2e847f1067d25ea3fa90a3b5a60f3f.jpg‘, 1, 0, 0)"""
if __name__ == ‘__main__‘:
s = SqlSave()
s.process_item()
原文:http://www.cnblogs.com/2bjiujiu/p/7223187.html
python协程池操作mysql_python_协程方式操作数据库相关推荐
- python小程序嵌入excel_用原生的方式操作Excel,Python玩转Excel神器xlsxwriter详解!...
大家好,在之前的Python办公自动化系列文章中,我们已经介绍了两个Python操作Excel的库openpyxl与xlwings,并且相信大家已经了解这两者之间的异同. 但是在Python中操作Ex ...
- 白话 Golang 协程池
文章目录 1.何为并发 2.并发的好处 3.Go 如何并发 4.G-P-M 调度模型 5.Go 程的代价 6.协程池的作用 7.简易协程池的设计&实现 8.开源协程池的使用 9.小结 参考文献 ...
- Go语言 有缓冲通道、协程池
文章目录 导言 有缓冲通道.线程池 有缓冲通道是什么? 例子 另一个例子 死锁 容量 vs 长度 WaitGroup 实现协程池 1. 创建数据结构 2. 创建相关函数 1. `digits`函数 2 ...
- java基于quasar实现协程池
业务场景:golang与swoole都拥抱了协程,在同任务并发数量下,协程可比线程多几倍.所以最近在查询java时了解java本身是没有协程的,但是某牛自行实现了协程,也就是本文的主角quasar(纤 ...
- 连接池和协程池为何能提升并发能力?
你有没有发现,"内存池"和"进程池"都带有"池"字?其实,这两种技术都属于"池化技术".它通常是由系统预先分配一批资源并 ...
- Golang并发模型:轻松入门协程池
goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理.但有时候,我们还是想控制一下. 比如,我们有A.B两类工作,不想把太多资源花费在B类务上,而 ...
- 应用调优常用技巧-線程池
应用调优常用技巧-線程池 应用调优常用技巧 - 线程池 線程池的好處 核心API-操作類 核心API-監控類 2-2 线程池BlockingQueue详解.选择与调优 調優技巧 2-3 线程池Sche ...
- 綫程池 部分代碼實現 筆記
計算機中常用的池(池式結構) 内存池 數據庫連接池 請求池 消息隊列(消息池) 對象池 緩衝區 綫程池解決問題 異步解耦的作用,如讀寫磁盤,檢測IO 綫程池三個部分 1 多個綫程s 2 多個任務 3 ...
- python协程池操作mysql_在python中使用aiomysql异步操作mysql
之前一直在使用mongo与redis,最近在项目中开始使用mysql数据库,由于现在的项目是全程异步的操作,所以在在网上查了下关于在python中异步的操作mysql,找来找去最后发现aiomysql ...
最新文章
- 【ACM】杭电OJ 2030
- 解决xe7无法找到system.pas的问题
- idea集成spring+spring MVC+mybatis问题
- Spring框架中的9种设计模式汇总
- .NET Remoting开发系列:(三) Remoting服务发布方式
- 数据结构期末复习之平衡二叉树
- 4轮拿下字节Offer,面试题复盘(含答案)
- 蓝点中文Linux2.0 实验十三 进程与作业管理
- 通信原理第六章思维导图
- 效率直接起飞的PPT技巧,你知道吗
- NaiveBayes
- 基于Dragonboard 410c的PMIC简介
- 持续集成服务 Travis CI 教程
- SQL Server AlwaysOn读写分离配置
- Windows 11 应用商店打不开,点了没反应解决办法,亲测可用
- 2019大数据领域十大必读书籍
- 批处理注销计算机当前用户名,批处理实现重起和注销的指令是什么?
- 华为ensp保存网络设备配置和导出导入网络设备
- 用计算机图形画一个杯子的代码,六年级LOGO小海龟编程教程.doc
- linux中文件在外存的物理地址放在,Linux文件系统中,文件在外存的物理地址放在 ( ) 中...
热门文章
- [渝粤教育] 中国地质大学 大学英语(1) 复习题
- 【渝粤题库】陕西师范大学300018 世界史(下)
- 【渝粤题库】陕西师范大学292241金融市场学Ⅰ 作业(高起专)
- 2021年春季学期期末统.考试 公司概论 试题
- 初识斯蒂尔杰斯积分(Stieltjes integral)
- php5.6 连接 oracle,XAMPP中PHP5.6.3连接Oracle
- 倍福嵌入式控制器PLC各型号简介
- linux抓包提示没有权限,linux下wireshark不用sudo权限抓包包
- SwipeRefreshLayout官方推荐下拉刷新
- linux应用程序是什么,linux下c开发了一个应用程序,它的扩展名是什么?