Radzhab
@Radzhab

Как поделить коллекцию между потоками поровну?

Есть два списка

var proxy = new List<string>(); // 4 прокси
var urls = new List<string>(); // 100 урлов


Я использую Parallel.For для того чтобы реализовать многопоток. Теперь стоит вопрос в том чтобы каждый прокси делал только 25 запросов (25*4=100). Как я вижу самый лучший вариант поделить список на urls.Count/proxy.Count. Однако может быть такое что если коллекция будет больше, то получается что один и тот же поток с одной прокси может несколько раз взять данные из коллекции. Как быть?

Parallel.ForEach(Partitioner.Create(0, urls.Count, urls.Count/proxy.Count),new ParallelOptions{MaxDegreeOfParallelism = 10},range =>
           {
               for (int i = range.Item1; i < range.Item2; i++)
               {
                   ....
               }
           });
  • Вопрос задан
  • 137 просмотров
Пригласить эксперта
Ответы на вопрос 1
petermzg
@petermzg
Самый лучший программист
Так добавьте информацию о состоянии потоков.
Примерно так:
var threadInfos = new Dictionary<Thread, Tuple<DateTime, int>>();
var thread = Thread.CurrentThread;
if (threadInfos[thread].Item2 >= 25 && (DateTime.Now - threadInfos[thread].Item1).TotalSeconds < 3 )
   return;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы