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
- python用epoll方式实现客户端对服务端发起大量连接(长连接)
- python用epoll方式实现客户端对服务端发起大量连接(短连接)
- python用select方式实现io复用对服务端发起大量连接(长连接)
- python用select方式实现io复用对服务端发起大量连接(短连接)
- Android Bluetooth蓝牙客户端发起对服务端连接建立请求过程(高版本Android兼容)
- Android客户端 C#服务端 实现socket长连接
- Netty实现服务端客户端长连接通讯及心跳检测
- Netty实现服务端客户端长连接通讯及心跳检测
- Netty实现服务端客户端长连接通讯及心跳检测
- 通过netty实现服务端与客户端的长连接通讯,及心跳检测。
- Netty实现服务端客户端长连接通讯、心跳检测及自定义报文发送(一)
- Python 服务端与客户端 TCP连接
- nodejs socket长连接服务端和测试客户端
- 客户端与服务端长连接Mina框架讲解
- Socket编程简单实现服务端客户端连接
- Cocos2dx + Libev + protobuf 实现长连接客户端
- android中对服务端的长连接【socket】
- android中对服务端的长连接【socket】
- Parallel::ForkManage: 一个简单的并行进程用于fork管理:
- 第一天 记录开通博客的第一篇
- Android中去掉ActionBar的几种方法
- Find All Numbers Disappeared in an Array
- Mono.Cecil 初探(一):实现AOP
- python用epoll方式实现客户端对服务端发起大量连接(长连接)
- 卡牌操作 线段树维护区间连通性
- Android知识点整理(六)
- 将集合中的学生的年龄升序排列
- 数组中出现次数异常的问题
- C语言const的修饰
- FZU
- windows中使用Git工具连接GitHub(配置篇)
- 用Maven创建第一个web项目