文档章节

pycurl.CurlMulti中如何检测发生故障的句柄

junanhonglei
 junanhonglei
发布于 2016/05/08 22:10
字数 413
阅读 114
收藏 1
#-*-coding:utf-8 -*-
'''
  问题:
   1,pycurlmulti如何在运行中检测到出现故障的请求?
        a) m.perform 返回的正确数小于加入的句柄数
        b) m.info_read 读取发生故障的句柄及原因(注意只能给读取一次)
        c) 移除句柄,然后重新添加。
'''
import time
import threading
from functools import partial
import traceback
import pycurl
from io import BytesIO

MAX_CONNCETION_NUM = 500


index2count= {}
#避免运行时增加
for index in range(MAX_CONNCETION_NUM):
    index2count[index] = 0
    
def period_check():
    while True:
        now = time.time()
        count =0
        for k,v in index2count.items():
            print (k,v)
            count += v
        print ("---------------",count)
        time.sleep(10)
        
def dealer_data( buffer,index ):
    index2count[index] +=1

def get_one_curl( url,index):
    #lc_data = threading.local()
    c = pycurl.Curl()
    c.setopt(c.NOSIGNAL, 1) #解决抛出SegmentFault的问题,
    # 2 设置选项 
    c.setopt(c.WRITEFUNCTION, partial(dealer_data,index=index ) )
    #STR;BRUX0;Brussels;RTCM 3.0;1004(1),1006(10),1008(10),1012(1);2;GPS+GLO;IGS;BEL;50.47;4.21;0;0;SEPT POLARX4TR;none;B;N;1300;ROB
    c.setopt(c.URL, url )
    c.setopt(pycurl.USERPWD,"user:passwd")
    #c.setopt(pycurl.HTTP_VERSION, pycurl.CURL_HTTP_VERSION_1_0 )
    c.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_BASIC)
    c.setopt(pycurl.HTTPHEADER, ("Ntrip-Version: Ntrip/2.0",'User-Agent: NTRIP ExampleClient/2.0'))#此处为必须!
    return c
    
def build_pycurlmulti( dest_url, connection_num ):
    '''
       短时间内发起大量连接会被拒绝
    '''
    m = pycurl.CurlMulti()
    curls =[]
    
    for index in range(connection_num):
        c = get_one_curl( dest_url, index  )
        curls.append(c)
        m.add_handle( c )    
        #ret, num_handles = m.perform()
        #time.sleep(0.1) #每隔1秒添加一个句柄,防止大量并发连接请求被服务器拒绝。
    while 1:
        ret = m.select(1.0)
        if ret == -1:  continue
        while 1:
            ret, num_handles = m.perform()

            if connection_num != num_handles:
                error_info = m.info_read()[2]
                for curl_obj, error_num,error_str in error_info:
                    #7 Failed to connect to fastgis.cn port 5000: Timed out
                    #56 Recv failure: Connection was reset
                    if error_num in (7,56):
                        m.remove_handle(curl_obj)
                        m.add_handle(curl_obj)
            if ret != pycurl.E_CALL_MULTI_PERFORM: 
                break            
    '''
    Ntrip-Version: Ntrip/2.0<CR><LF>
    User-Agent: NTRIP ExampleClient/2.0<CR><LF>    
    '''    


import threading
threads = []
# 1,看门狗,状态检测线程
threads.append( threading.Thread(target=period_check, args=()  ) )
# 2, 
host="http://fastgis.cn:5000/file"
threads.append( threading.Thread(target=partial(build_pycurlmulti , dest_url=host,  connection_num= MAX_CONNCETION_NUM ) ) )

for t in threads:
    t.start()
    
for t in threads:
    t.join()
pass


© 著作权归作者所有

共有 人打赏支持
junanhonglei
粉丝 8
博文 102
码字总数 39613
作品 0
鄂州
架构师
私信 提问
Netty系列之Netty高可靠性原理分析

背景 1.1. 宕机的代价 1.1.1. 电信行业 毕马威国际(KPMG International)在对46个国家的74家运营商进行调查后发现,全球通信行业每年的收益流失约为400亿美元,占总收入的1%-3%。导致收益流失...

tantexian
2016/07/22
69
0
Polly的多种弹性策略介绍和简单使用

什么是Polly? Polly是一个.NET弹性和瞬态故障处理库.允许我们以非常顺畅和线程安全的方式来执行诸如行重试,断路,超时,故障恢复等策略。 Polly项目地址:https://github.com/App-vNext/Po...

九_ER
08/08
0
0
句柄泄漏调试经验

句柄泄漏检测-简单 在调试之前首先确定是不是真的发生了句柄泄漏,简单的检测方法是通过任务管理器来查看进程的句柄数是不是居高不下,任务管理器默认不显示句柄数,要查看进程的句柄数需要先...

nothingfinal
2017/01/23
0
0
记一则罕见的hive字段值异常引起map阶段的OOM

前段时间遇到了一个很诡异的发生的Map阶段的OOM异常,花了些时间才找到原因,这个简要记录一下。 先看log。 节点一的TaskTracker的log: 节点二的TaskTracker的log: 节点三的TaskTracker的l...

zengzhaozheng
07/02
0
0
分析Tomcat类加载机制触发的Too many open files问题

  分析Tomcat类加载机制触发的Too many open files问题   Too many open files意思是打开文件太多了那么碰到Tomcat类加载机制触发的Too many open files问题要如何来处理,我们这边一起来...

时间财富网
2016/11/24
23
1

没有更多内容

加载失败,请刷新页面

加载更多

EOS官方钱包keosd

EOS官方钱包的名称是keosd,它负责管理你的私钥,并且帮你进行交易的签名。 不过不幸的是,keosd钱包对普通用户并不友好,它是一个命令行程序,目前还没有像以太坊的mist那样的图形化界面,而...

汇智网教程
今天
23
0
ArrayList的实现原理以及实现线程安全

一、ArrayList概述 ArrayList是基于数组实现的,是一个动态的数字,可以自动扩容。 ArrayList不是线程安全的,效率比较高,只能用于单线程的环境中,在多线程环境中可以使用Collections.syn...

一看就喷亏的小猿
今天
25
0
Netty 备录 (一)

入职新公司不久,修修补补1个月的bug,来了点实战性的技术---基于netty即时通信 还好之前对socket有所使用及了解,入手netty应该不是很难吧,好吧,的确有点难,刚看这玩意的时候,可能都不知道哪里...

_大侠__
昨天
33
0
Django简单介绍和用户访问流程

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。 Django遵守BSD版权,初...

枫叶云
昨天
41
0
Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

应用场景 之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试...

程序猿DD
昨天
22
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部