python用epoll方式实现客户端对服务端发起大量连接(长连接)

来源:互联网 发布:模拟退火算法应用 编辑:程序博客网 时间:2024/04/29 18:33

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

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


长连接情况下

def epoll_run(self):    used= 0    trans_dict ={}    start_time_dict={}    epoll = select.epoll()    for i in range(self.socket_num_per_thread):        trans = self.trans_init()        if trans == "err":            continue        start_time_dict[trans.sockfd.fileno()]=[]        trans_dict[trans.sockfd.fileno()]=trans        # 对该sock进行注册        epoll.register(trans.sockfd.fileno(), select.EPOLLIN |select.EPOLLOUT |select.EPOLLERR )    while used < self.run_time:        error = ''        used = time.time() - self.start_time        start = self.default_timer()        timeout=0.001        events = epoll.poll(timeout)        if not events:            continue        for fd, event in events:            if event & select.EPOLLIN:                try:                    trans_dict[fd].client_recv()                    self.count_dict["recv"] += 1                except Exception, e:                    error = str(e).replace(',', '')                try:                    scriptrun_time = self.default_timer() - start_time_dict[fd][0]                    start_time_dict[fd].remove(start_time_dict[fd][0])                except Exception, e:                    scriptrun_time = self.default_timer() - start                elapsed = time.time() - self.start_time                epoch = time.mktime(time.localtime())                fields = (elapsed, epoch, self.user_group_name, scriptrun_time, error, trans_dict[fd].custom_timers)                self.queue.put(fields)            if event & select.EPOLLOUT:                try:                    while qps_control.use_QPS_NUM():                        used = time.time() - self.start_time                        if used > self.run_time:                            break                        time.sleep(0.001)                    if used > self.run_time:                        break                    start_time_dict[fd].append(self.default_timer())                    trans_dict[fd].request = self.data_list[self.count_dict["send"] % len(self.data_list)]  ### 传递数据文件                    trans_dict[fd].client_send()                    self.count_dict["send"] += 1                except Exception, e:                    error = str(e).replace(',', '')            if event & select.EPOLLERR:                # print "some err conn"                epoll.unregister(fd)                trans_dict[fd].client_close()                trans_dict.pop(fd)    for fd,trans in trans_dict.items():        try:            epoll.unregister(fd)            trans.client_close()        except Exception, e:            print "err close ",e    epoll.close()

def trans_init(self):    trans = self.script_module.DIDItest()    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

根据系统自动选择io复用方式

def run(self):    if self.run_style =="sync":        self.normal_run()    elif self.run_style =="asyn":        sysstr = platform.system()        if (sysstr == "Linux"):            self.epoll_run()        else:            self.select_run()    else:        print "Error: run style error !!!"




阅读全文
0 0
原创粉丝点击