python用select方式实现io复用对服务端发起大量连接(短连接)

我们知道的大多数io复用方式都是在服务端接受连接的时候进行,

但如果要进行压测,则需要客户端发起连接的时候用,那么要怎么用呢,看下文


短连接情况下



def select_run(self):
    used= 0
    rlist=[]
    trans_dict={}
    start_time_dict={}
    num_of_socket =0
    while used < self.run_time:
        used = time.time() - self.start_time
        error = ''
        if num_of_socket < self.max_socket:
            trans = self.trans_init()
            if trans == "err":
                continue
            rlist.append(trans.sockfd)
            trans_dict[trans.sockfd] = trans
            start_time_dict[trans.sockfd] = self.default_timer()
            num_of_socket +=1
            while qps_control.use_QPS_NUM():
                used = time.time() - self.start_time
                if used >self.run_time:
                    break
                time.sleep(0.001)

            try:
                if used <self.run_time:
                    trans.client_send()
                    self.count_dict["send"] += 1
            except Exception, e:
                error = str(e).replace(',', '')

        r_list, w_list, e_list = select.select(rlist, [], rlist, 0.001)
        for conn in r_list:
            try:
                trans_dict[conn].client_recv()
                self.count_dict["recv"] += 1
            except Exception, e:
                error = str(e).replace(',', '')
            scriptrun_time = self.default_timer() - start_time_dict[conn]
            start_time_dict.pop(conn)
            elapsed = time.time() - self.start_time
            epoch = time.mktime(time.localtime())
            fields = (elapsed, epoch, self.user_group_name, scriptrun_time, error, trans_dict[conn].custom_timers)
            self.queue.put(fields)
            rlist.remove(conn)
            trans_dict[conn].client_close()
            trans_dict.pop(conn)
            num_of_socket -=1
        for conn in e_list:
            print "some err conn"
            rlist.remove(conn)
            trans_dict[conn].client_close()
            trans_dict.pop(conn)
            num_of_socket -= 1

    for fd,trans in trans_dict.items():
        trans.client_close()

def trans_init(self):
    trans = self.script_module.test()
    trans.custom_timers = {}
    # scripts have access to these vars, which can be useful for loading unique beatles_data
    trans.thread_num = self.thread_num
    trans.process_num = self.process_num
    try:
        trans.client_open()
        trans.sockfd.setblocking(self.block_flag)  # 设置阻塞非阻塞 True为阻塞,False为非阻塞
        trans.sockfd.settimeout(self.timeout_ms)           #设置socket超时,None为不设置超时
        # print self.block_flag,self.timeout_ms
    except Exception, e:  # test runner catches all script exceptions here
        return "err"
    trans.request = self.data_list[self.count_dict["send"] % len(self.data_list)]
    return trans

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值