2010-04-21 18 views
7

Yükü n uç noktalarda zamanlamak için yuvarlak bir robin algoritması yazmam gerekiyor mu?Yuvarlak bir robin algoritması ile zamanlama yükü?

Yani sunucuların A, B ve C

Ben olsun her istek için içlerinden yuvarlak robin emin olmak istedim ben varsa. Bunu C# 'da nasıl yaparım? Sadece yuvarlak robin kaydı, tanımı için

+1

Bu, sabit bir yük olacak mı yoksa hatta yük dağılımı mı istiyorsunuz? – Avitus

+0

'Yuvarlak robin', yükü eşit olarak dağıtmaya yönelik hiçbir girişimin olmadığını düşünüyorum. –

cevap

18

:

http://en.wikipedia.org/wiki/Round-robin_scheduling

Sadece bir kuyruk kullanabilir. Üstünden bir tane al, onu kullan ve geri koy. Bu, kullanılan en yeni olanın her zaman alınacak sonuncu olmasını sağlar. Sıra sınıfına

Queue<Server> q = new Queue<Server>(); 

//get the next one up 
Server s = q.DeQueue(); 


//Use s; 


//put s back for later use. 
q.Enqueue(s); 

Bağlantı: bitiş noktaları List veya Array aracılığıyla erişilen ise

http://msdn.microsoft.com/en-us/library/7977ey2c.aspx

+0

Ben yuvarlak robin demek gerçekten anlamak için yuvarlak robin uygulamak istediğini söyleyen bir kişi meydan okuyacağım. – Tim

+2

Sunucu yükleme dağıtımında her zaman kullanılır. – kemiller2002

+1

Bu kalıbı kullanırken, sunucuyu kullanmadan önce derhal siteye eklemeniz (ya da enqueue'u son blokta koymak) faydalı olabilir. Bu şekilde, sunucuyu "kullanma" sırasında atılan istisnalar, sunucunun tamamen döndürmeden kaldırılmasına neden olmaz. – bvoyelr

1

, sadece dairesel biçimde bir dizin artırmak gerekir:

public class RoundRobinIndex 
{ 
    volatile int index = 0; 
    int count; 

    public int Next 
    { 
     get 
     { 
      if (index == count) 
      { 
       index = 0; 
      } 
      return index++; 
     } 
    } 

    public RoundRobinIndex(int countArg) 
    { 
     count = countArg; 
    } 
} 
+0

Bunu kullanmak bir IndexOutOfRangeException neden olur – IBootstrap

+0

@IBootstrap - Bir IndexOutOfRangeException neden olmaz. Gerçekten test ettin mi? –

+0

İleri aşağıdakileri kullanarak da elde edebilirsiniz: (index + 1)% count; – Aerokneeus

6

Ebpower ile aynı fikir, ancak bir sonraki öğenin indeksi değil, sonraki öğenin ne olduğuna odaklanma.

public class RoundRobinList<T> 
{ 
    private readonly IList<T> _list; 
    private readonly int _size; 
    private int _position; 

    public RoundRobinList(IList<T> list) 
    { 
     if (!list.Any()) 
      throw new NullReferenceException("list"); 

     _list = new List<T>(list); 
     _size = _list.Count;    
    } 

    public T Next() 
    { 
     if (_size == 1) 
      return _list[0]; 

     Interlocked.Increment(ref _position); 
     var mod = _position % _size; 
     return _list[mod]; 
    } 
} 
+0

IEnumerable 'u yapıcıya aktarın ve Arttırma _pozisyonundan önce kayıt modunu girin ve bu paradır. – JJS