- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2011-07-22 12:06 编辑
回复 yulihua49
我想至少要有个线程保证在处理网络输入,而不是自己去做事,应该丢到 任务队列里,排队去。或者靠优先级,让高优先级的直接处理,长时间的丢队列。
其实这样我觉得和HS/HA半同步/半异步模式 差不多了,这个可能更高效点,在线程资源的使用上。ydfgic 发表于 2011-07-20 17:57 ![]()
的确如此。看看主线程片断:- while(1) {
- do {
- FD_ZERO(&efds);
- FD_SET(sock, &efds);
- //健康检查周期
- tm.tv_sec=30;
- tm.tv_usec=0;
- ret=select(sock+1,&efds,NULL,&efds,&tm);
- if(ret==-1) {
- ShowLog(1,"select error %s",strerror(errno));
- close(sock);
- quit(3);
- }
- if(ret==0) {
- check_TCB_timeout();
- if(poolchk) poolchk();
- }
- } while(ret<=0);
- i=event_no();
- s=accept(sock,(struct sockaddr *)&cin,&leng);
- if(s<0) {
- ShowLog(1,"%s:accept err=%d,%s",__FUNCTION__,errno,strerror(errno));
- switch(errno) {
- case EMFILE: //fd用完了,其他线程还要继续工作,主线程休息一下。
- case ENFILE:
- sleep(30);
- continue;
- default:break;
- }
- sleep(15);
- if(++repeat < 20) continue;
- ShowLog(1,"%s:network fail! err=%s",__FUNCTION__,strerror(errno));
- close(sock);
- quit(5);
- }
- repeat=0;
- task=&client_q.pool[i];
- client_q.pool[i].fd=s;
- task->conn.Socket=s;
- task->conn.timeout=120;
- task->status=-1;
- task->conn.only_do=(int (*)())conn_init;
- ret=do_epoll(task,EPOLL_CTL_ADD);//任务交到epoll队列。
- }
复制代码 |
|