您的位置:首页 > 编程语言 > Python开发

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

2017-09-12 16:47 615 查看
我们知道的大多数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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息