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()

  

时间: 2024-12-24 10:36:24

python_协程方式操作数据库的相关文章

python已协程方式处理任务

#从genent中导入monky模块① from gevent import monkey #把程序变成协程的方式运行② monkey.patch_all() import gevent,requests,time #导入requests和time start = time.time() #记录程序开始时间 url_list = ['https://www.baidu.com/', 'https://www.sina.com.cn/', 'http://www.sohu.com/', 'http

PDO访问方式操作数据库

mysqli是专门访问MySQL数据库的,不能访问其它数据库.PDO可以访问多种的数据库,它把操作类合并在一起,做成一个数据访问抽象层,这个抽象层就是PDO,根据类操作对应的数据库.mysqli是一个类,PDO也是一个类,只不过PDO这个类功能更加强大. PDO的功能1.访问不同的数据库2.自带事务功能.事务是指同时执行几条sql语句,但是其中1条语句出了错无法执行,那么所有的就都执行失败.3.防止SQL注入攻击. 1.访问不同数据库 下面代码是访问MySQL数据库的,如果访问其它数据库,只需要

c# cs方式操作数据库 非使用sql连接字符串直接连接数据库

.net 底层数据库传输程序 分为服务器端与客户端 此程序作用有: 1.解决直连数据库有相当大的安全隐串. 2.大广域网使用时,大数据的查询相当的时候是耗在网速传输,这个解决了大数据量传输的问题.大数据量进行压缩可以 提高速度7~40倍. 3.由于此框架底层使用tcp作为连接,可以发即时消息.实时传文件.可以作为,程序提交表单,时时提醒功能. 4.兼容三层框架.三层框架程序几乎不需要改动就可以直接使用. 服务器端: 服务器端比较简单,几行代码就可以搞定 1. 添加引用 DataUtils.v1.

九、.net core用orm继承DbContext(数据库上下文)方式操作数据库

一.创建一个DataContext普通类继承DbContext 二.配置连接字符串(MySql/SqlServer都可以) using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace DotNetCore.Models { public class DataContext

python之协程与IO操作

协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕. 所以子程序调用是通过栈实现的,一个线程就是执行一个子程序. 子程序调用总是一个入口,一次返回,调用顺序是明确的.而协程的调用和子程序不同. 协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,

Python_进程、线程及协程

一.Python进程 IO密集型----多线程 计算密集型----多进程 1.单进程 from multiprocessing import Process def foo(i): print('你好哈',i) if __name__ == '__main__': #if __name__ == '__main__':只可做测试调用,不能用于生产,windows不支持,linux中可不用添加if __name__ == '__main__' for i in range(10): t = Pro

MFC,ADO方式实现数据库操作

参考: MSDN数据访问编程 (MFC/ATL): https://msdn.microsoft.com/zh-cn/library/kd4ck1tt.aspx?f=255&MSPPError=-2147217396 ado方式操作数据库封装类的使用范例: http://download.csdn.net/detail/xianglitian/2383423 使用ADO封装类的数据库程序开发实例: http://wenku.baidu.com/link?url=A3g4_Ucz1RuijQMZ8

第四十一天:协程操作

1.无论是进程还是线程都是由操作系统的时间片时间来进行操控,无法进行人为的控制,并且进行的都是并发程序.从微观上看还是同一时间执行一个程序. 2.进程是资源分配的最小单位,线程是cpu调度的最小单位.在开启线程的过程中,创建一个线程需要创建一个寄存器和堆栈,这些都是要花费时间的. 3.协程操作:为了实现并发操作:主要是为了多个任务之间进行切换. 4.以前学的生产者消费者模型里就含有这种模式的模型: def consumer(): while True: x=yield print('处理了数据'

python2.0_s12_day9_协程&Gevent协程

Python之路,Day9 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 协程 1.协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程.(操作系统跟不知道它存在),那你指定协程的实现原理是什么吗? 我们来聊聊协程的实现原理: 首先我们知道多个线程在一个单核CPU上进行并发,它的操作过程是,操作系统能调动的最小单位是线程,当操作系统触发多个线