Планирование загрузки с помощью алгоритма циклического перебора? - PullRequest
7 голосов
/ 21 апреля 2010

Мне нужно написать алгоритм циклического перебора для планирования загрузки на n конечных точек?

Так что, если у меня есть серверы A, B и C

Я хотел удостовериться, что они проходят через них для каждого запроса, который я получаю. Как мне это сделать в C #?

Ответы [ 3 ]

20 голосов
/ 21 апреля 2010

Только для записи, определение циклического перебора:

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

Просто используйте очередь. Снимите один с вершины, используйте его и положите обратно. Это гарантирует, что последний использованный всегда будет последним, который будет выбран.

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);

Ссылка на класс очереди:

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

7 голосов
/ 03 июня 2013

Та же идея, что и в ebpower, но сосредоточена на том, что является следующим элементом, а не на том, что является индексом следующего элемента.

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];
    }
}
1 голос
/ 21 апреля 2010

Если доступ к вашим конечным точкам осуществляется через List или Array, вам нужно только увеличить индекс циклически:

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;
    }
}
...