异步协程处理requests阻塞

来源:互联网 发布:纹理过滤 三线性优化 编辑:程序博客网 时间:2024/05/26 08:42
#!//bin/python# -*- coding: UTF-8 -*-'''date : 2017-07-27@author: vassago'''from gevent import monkeymonkey.patch_all()import sysreload(sys)sys.setdefaultencoding('utf-8')import requestsimport timeimport geventfrom gevent import poolimport reimport mathimport pymysqlfrom DBUtils.PooledDB import PooledDB# db ip'''db msg'''# 数据库连接池mysql_db_pool = PooledDB(creator=pymysql, mincached=1, maxcached=2, maxconnections=100, host=base_ip, port=3306,                         user=base_user, passwd=base_pwd, db=base_db, charset='utf8', use_unicode=False, blocking=True)# target urlURL = ''complete_count = 0# log--from datetime import datetimeimport functoolsfrom collections import defaultdictfunc_count_dict = defaultdict(int)def func_time_logger(fun):    if fun.__dict__.get('mioji.aop_utils.logger', False):        return fun    fun.__dict__['mioji.aop_utils.logger'] = True    @functools.wraps(fun)    def logging(*args, **kw):        func_count_dict[fun.__name__] += 1        begin = datetime.now()        result = fun(*args, **kw)        end = datetime.now()        func_count_dict[fun.__name__] -= 1        print 'func {0}, cost:{1}, ex:{2}'.format(fun.__name__, end - begin , func_count_dict[fun.__name__])        return result    return logging# --log# 获得代理@func_time_loggerdef get_PROXY():    # 代理url    R = requests.get(url)    p = R.content    if p.startswith('10.'):        # if p.split(':')[0] in SOCKS_PROXY:        PROXY = {        'http': 'socks5://' + p,        'https': 'socks5://' + p        }    else:        self.real_ip = p.split(':')[0]        proxy_type = 'http'        PROXY = {            'https': 'http://' + p,            'http': 'http://' + p,        }    return PROXY# requests@func_time_loggerdef get_request_data(x, y):    i = 0    while i < 3:        try:            r = requests.get(URL, proxies=get_PROXY(), timeout=(5, 10))            data = r.content            return data        except:            print 'get error'            i += 1    return None# process function@func_time_loggerdef process(a1,a2):    get_request_data(x,y)    '''    other works    '''    global complete_count    complete_count += 1    print 'end {0}'.format(sid)    print 'complete {0}'.format(complete_count)# 异步协程处理请求量大的需求if __name__ == '__main__':    s = time.time()    gs = []    for data in data_list:        g = execute_pool.apply_async(process, args=(a1, a2,))        gs.append(g)    gevent.joinall(gs)    print time.time() - s