我们知道的大多数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