文档章节

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

junanhonglei
 junanhonglei
发布于 2016/05/08 22:10
字数 413
阅读 85
收藏 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
I/O多路复用详解—支持I/O复用的系统调用select

1、select函数 select系统调用是用来让我们的程序监视多个文件句柄(file descrīptor)的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有某一个或多个发生了状态改变。 文件在...

安卓推送
2013/10/25
162
0

没有更多内容

加载失败,请刷新页面

加载更多

设计模式之 明确责任 观察者模式 状态模式 责任链模式

观察者模式是任务分发的一种模式。 如果认为我们设计的系统的各个模块(或子系统)的最终目的是完成共同任务,那么这个任务如何分配到多个模块的就是我们遇到的第一个问题。简单设计场合我们...

backbye
20分钟前
2
0
14-利用思维导图梳理JavaSE-大汇总

14-利用思维导图梳理JavaSE-Java基础知识大汇总 主要内容 1.对象入门 2.一切都是对象 3.程序流程控制 4.初始化和消除 5.权限访问控制 6.复用类 7.多态 8.接口与抽象类 9.内部类 10.容器 11.异...

飞鱼说编程
56分钟前
6
0
利用Lombok编写优雅的spring依赖注入代码,去掉繁人的@Autowired

大家平时使用spring依赖注入,都是怎么写的? @Servicepublic class OrderService { @Autowired private UserService userService;} 是不是很熟悉的感觉?但是呢 如果你用...

HeyS1
今天
26
0
IBATIS 写BLOB字段遇到的问题

1、 首先遇到的配置问题,通过设置typeHandler 来支持写入。接下来由此引出了事务的问题。 <typeHandler jdbcType="BLOB" javaType="[B" callback="org.springframework.orm.ibatis.support....

echo-neo
今天
1
0
37. Sudoku Solver

Description tags: backtrack,hash table difficulty: hard Write a program to solve a Sudoku puzzle by filling the empty cells.A sudoku solution must satisfy all of the following......

52iSilence7
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部