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/.

未完待续。。。

本章主要总结协程的应用场景

原创粉丝点击