乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      【2019-11-07】twemproxy事件--by 閆昌

       小世界的野孩子 2020-02-16

      epoll簡介:

      函數(shù):epoll_create;、epoll_ctl;、epoll_wait;

      epoll_create(size);//size 低版本生效,高版本不生效

      epoll 的LT模式

      水平觸發(fā)模式,epoll_wait的處理流程為:遍歷就緒的鏈表,把fd的buf中有數(shù)據(jù)的fd返回給用戶,并在鏈表中保留該節(jié)點,buf中沒數(shù)據(jù)的則從鏈表中剔除,放回紅黑樹中,這么做的好處是,只要fd中海油未處理的數(shù)據(jù),都會通過epoll_wait讀取到,缺點是,每次需遍歷,性能差。

      epoll的EL模式
      邊緣觸發(fā)模式,epoll_wait就非常簡單,返回鏈表中所有的fd給用戶,并情況就緒列表,放回紅黑樹中,等待新事件到來。好處就是性能高,缺點是,用戶拿到fd后讀取其數(shù)據(jù)時每次沒讀取完,造成事件的丟失。

      twemproxy對事件的使用

      twemproxy對epoll/kqueue/evport進行了統(tǒng)一封裝,一般linux使用epoll, mac使用kqueue,Sun Solaris使用evport,為了統(tǒng)一底層api調(diào)用,對上面的三種事件處理api進行了接口的統(tǒng)一: event/nc_event.h

      相關結(jié)構(gòu)體

      struct event_base {
           int???ep;??/* epoll descriptor */
           struct epoll_event *event;?/* event[] - events that were triggered */
           int????nevent;?/* # event */
           event_cb_t???cb;?/* 回調(diào)函數(shù)event callback */
           };

      事件處理核心api參考:

      • event_base_create()? ? 創(chuàng)建事件循環(huán)管理fd
      event_base_create(int nevent, event_cb_t cb)
      {
         ep = epoll_create(nevent);
         event = nc_calloc(nevent, sizeof(*event));
         evb = nc_alloc(sizeof(*evb));
         evb->ep = ep;
         evb->event = event;
         evb->nevent = nevent;
         evb->cb = cb;
      }
      • event_add_in()? ? ? ? ? ? ?將一個fd的讀事件納入事件管理器的管理中
      event_add_in(struct event_base *evb, struct conn *c)
      {
        struct epoll_event event;
        int ep = evb->ep;
        event.events = (uint32_t)(EPOLLIN | EPOLLET);//ET模式
        status = epoll_ctl(ep, EPOLL_CTL_MOD, c->sd, &event);
      }
      • event_add_out()? ? ? ? ? ?將一個fd的讀寫事件納入事件管理器的管理中
      event_add_out(struct event_base *evb, struct conn *c)
      {
        struct epoll_event event;
        int ep = ev->ep;
        event.events = (uint32_t)(EPOLLIN | EPOLLOUT | EPOLLET);
        status = epoll_ctl(ep, EPOLL_CTL_MOD, c->sd, &event);
      }
      • event_add_conn()? ? ? ? 將一個fd的讀寫事件納入事件管理器的管理中
      event_add_conn(struct event_base *evb, struct conn *c)
      {
         struct epoll_event event;
         int ep = evb->ep;
         event.events = (uint32_t)(EPOLLIN | EPOLLOUT | EPOLLET);
         event.data.ptr = c;
         status = epoll_ctl(ep, EPOLL_CTL_ADD, c->sd, &event);
      }
      • event_wait()? ? ? ? ? ? ? ? ? 從事件管理器中獲取準備好讀/寫的fd列表,并調(diào)用cb進行處理
      event_wait(struct event_base *evb,int timeout)//自己封裝的epoll_wait
      {
       struct epoll_event event;
       int nevent = evb->nevent;
       for(;;) {
         int i, nsd;
         nsd = epoll_wait(ep, event, nevent, timeout);
         for(i =0; i < nsd; i++) {
          struct epoll_event *ev = &evb->event[i];
          uint32_t events =0;
          if(ev->events & (EPOLLIN | EPOLLHUP))    {
              events |= EVENT_READ;
          }
          if(ev->events & EPOLLOUT) {
              events |= EVENT_WRITE;
          }
          if(evb->cb != NULL) {
              evb->cb(ev->data.ptr, events);//執(zhí)行回調(diào)函數(shù) cb是在 event_base_create添加 
          }
         }
        }
      }

      怎么用:

      todo

      負載均衡算法

      redis協(xié)議的解析

      多個redis命令在一起怎么處理,粘包問題

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多