nginx round robin 演算法的實現

2021-06-03 07:51:28 字數 2988 閱讀 7031

//last_cached為0了,則

pc->cached = 0;

pc->connection = null;

if ( rrp->peers->single ) //只有乙個backend,直接返回第0項

else 

//當前失敗的次數大於  max_fails 了,則看是否到了再次嘗試的時間段,

//如果到了再次嘗試的時間,則返回這個backend,再次嘗試

if ( now - peer->accessed > peer->fail_timeout )

// 還沒有到再次嘗試的時間段,則設定比重為0,不可能再次被選到了

peer->current_weight = 0;

}else // 已經掛掉了,設定已經嘗試過了

pc->tries--; // 嘗試的backend 數量減少1

}//已經嘗試過這個backend了,遞減i再次嘗試一下

if ( pc->tries == 0 ) //嘗試次數為0了,失敗了

if ( --i == 0 ) // 嘗試次數不是0,遞減i看是不是0,如果為0則失敗了

}//遞減weight

peer->current_weight--;

}else

if ( now - peer->accessed > peer->fail_timeout ) 

peer->current_weight = 0;

}else 

pc->tries--;

}//嘗試過了,round robin 迴圈 遞增指向下乙個

rrp->current++;

if ( rrp->current >= rrp->peers->number )

if ( pc->tries == 0 ) //嘗試次數為0了,則失敗了

if ( --i == 0 )

}peer->current_weight--;

}rrp->tried[ n ] |= m;

}//此時的peer指向找到的那個backend

pc->sockaddr = peer->sockaddr;

pc->socklen = peer->socklen;

pc->name = &peer->name;

/* ngx_unlock_mutex(rrp->peers->mutex); */

if ( pc->tries == 1 && rrp->peers->next ) 

}return ngx_ok;

failed:

peers = rrp->peers;

if ( peers->next ) // 如果有backup的,則嘗試backup備機

}//如果沒有backup,則將fails清0,再次嘗試

/* all peers failed, mark them as live for quick recovery */

for ( i = 0; i < peers->number; i++ ) 

/* ngx_unlock_mutex(peers->mutex); */

pc->name = peers->name;

return ngx_busy;

}//按照weight來返回乙個peer的下標

//找到當前比率最大的那項,返回這項的下標

}//找到最後了,還沒有比第i項比率大的,則說明這項就是,返回這項

if ( peer[i].current_weight > 0 ) 

return n;

}//走到這裡的時候,說明都是0了,重新初始化為滿額,接著迴圈找,總是能找到乙個

Perona Malik 演算法Python實現

最近正好在學習關於影象處理的東西,需要用到pm perona malik 演算法,所以就把自己的一些理解和 貼上來,希望能跟大家一起 pm演算法的具體原理可以網上查閱相關資料或者相關書籍,這裡只是簡要介紹大概的實現思路 一般而言,對乙個影象進行提取特徵之前,需要進行降噪濾波處理。最常用的應該是高斯濾...

Miller Rabin演算法 Python實現

用python實現了miller rabin的素性檢驗演算法 import random deflargeprime generate bit 1024 print generating large prime.i 1while true num random.randrange 2 bit 1 2...

LeetCode初級演算法的Python實現 鍊錶

之前沒有接觸過python編寫的鍊錶,所以這裡記錄一下思路。這裡前面的 是和leetcode中的一樣,因為做題需要呼叫,所以下面會給出。首先定義鍊錶的節點類。鍊錶節點 class listnode object def init self,x self.val x 節點值 self.next non...