python 协程 在批量插入时候的无能为力
来源:互联网 发布:矩阵的几求法 编辑:程序博客网 时间:2024/05/18 00:14
引言
需要压力测试需要添加至少500万的用户还有相关信息,目前只操作3各表,插入速度太慢了,插入一万条数据就需要30分钟左右。然后就想到很多办法去优化。首先想到了协程。
首先,协程就是解决并发问题的,插入语句是一种IO流操作,想着遇到io流阻塞就会切换这样插入的快一点
实验结果表明和不用协程实现插入时间上面区别不大
python 使用协程的程序如下
def add_user(self, number=10): gevent_list = [gevent.spawn(self.gevent_add_user_test, number) for i in range(2)] gevent.joinall(gevent_list) cellphone = 10000000000 def gevent_add_user_test(self, number): global cellphone # identity_card = 100000000000000000 user_query = self.user.get_query() user_query = self.user.order_by_id_desc(user_query) user_obj = Operation.first(user_query) if user_obj: if user_obj.cellphone: cellphone = int(user_obj.cellphone) i = 0 while i <= number: # OHHOLog.print_log(i) i += 1 cellphone += 1 while self.user.get_by_cellphone(str(cellphone)): cellphone = cellphone + 1 user_id = self.add_user_table(str(cellphone)) self.add_user_token_table(user_id) self.add_user_extension(user_id) print("for end") print("end")
没有使用协程的代码:
def add_user1(self, number=10): cellphone = 10000000000 # identity_card = 100000000000000000 user_query = self.user.get_query() user_query = self.user.order_by_id_desc(user_query) user_obj = Operation.first(user_query) if user_obj: if user_obj.cellphone: cellphone = int(user_obj.cellphone) i = 0 while i <= number: i += 1 cellphone += 1 while self.user.get_by_cellphone(str(cellphone)): cellphone = cellphone + 1 user_id = self.add_user_table(str(cellphone)) self.add_user_token_table(user_id) self.add_user_extension(user_id) print("for end") print("end")
使用直接插入的代码 结果用时5.6149分钟 使用协程5.920分钟
分析
对于向数据库里面插入,瓶颈不是在于程序而是 数据库的大量插入,现在这样说还是为使过早,还有一边文章会比较优化程序后的插入时间。
协程的应用场景不是向数据库读写等,是访问
协程的应用场景一
在爬取不通的网站时候并发爬取
像这样
from gevent import monkey; monkey.patch_all()import geventimport urllib2def f(url): print('GET: %s' % url) resp = urllib2.urlopen(url) data = resp.read() print('%d bytes received from %s.' % (len(data), url))gevent.joinall([ gevent.spawn(f, 'https://www.python.org/'), gevent.spawn(f, 'https://www.yahoo.com/'), gevent.spawn(f, 'https://github.com/'),])# 结果GET: https://www.python.org/GET: https://www.yahoo.com/GET: https://github.com/45661 bytes received from https://www.python.org/.14823 bytes received from https://github.com/.304034 bytes received from https://www.yahoo.com/.
未完待续。。。
本章主要总结协程的应用场景
阅读全文
0 0
- python 协程 在批量插入时候的无能为力
- 最无能为力的时候我想在什么东西上花钱
- Oracle复制某一个字段 批量修改(我们可以在插入的时候修改)
- mybatis批量更新或者插入的时候必须在数据库连接上打开allowMultiQueries选项
- Mybatis+Mysql 批量插入的时候返回主键ID
- python MySQL 批量插入
- 程序无能为力的领地
- 一生中无能为力的十件事
- 无能为力
- JDBC的批量批量插入
- JDBC的批量批量插入
- Python 数据批量插入 MySQL
- python批量插入数据库数据
- python向mySQL批量插入数据的方法
- python使用MySQLdb向mySQL批量插入数据的方法
- 利用python实现批量插入打印信息的方法
- python向MySQL批量插入数据的方法
- Python操作MongoDB 新建不同的collection 批量插入数据库
- anaconda的使用
- 学习笔记-FastDFS
- 阿里云MaxCompute持续挑战极限,北京云栖大会现场完成基于公共云的BigBench评测!
- [Android面试]Java创建线程的两种方式
- 锁原理:偏向锁、轻量锁、重量锁
- python 协程 在批量插入时候的无能为力
- SQL多列组成唯一键约束
- 创建.gitignore文件,忽略git不必要提交的文件
- Tensorflow编译源码安装
- ubunut16.04 server 配置静态ip
- unittest框架实战(九)
- 基于层次化多模态LSTM的视觉语义联合嵌入
- 基于mvc模式的应用框架之Hibernate(三)
- Oracle创建表空间、用户、分配权限、导出、导入数据