для параллельных i/o операций лучше использовать массив тасок с Task.WhenAll вместо Parallel.ForEach, а в первом ответе по этой ссылке чел говорит что Task.WhenAll создаст много ненужных тасок что плохо повлияет на перф. У меня есть массив урлов по которым нужно ходить параллельно что для этого лучше использовать?
Подождать нет6 можешь там завезли паралел асинк, в текущий реалиях массив тасок но ты можешь управлять набором активный накидыв сверху кода, или заюзать через я ченелы пайплан и там тоже можно управлять конкаренси
Зависит от кардинальности этого "массива урлов". Если это 2-3 урла, можно хоть whenall хоть parallel. Если у тебя постоянно обрабатываются новые урлы, то нужно регулировать степень параллелизма. Это организуется с помощью фиксированного количества джобов, которые в цикле вычитывают очередь.
net6 ждать не могу, про channel'ы почитаю спасибо
проблема в том что запросы асинковые поэтому parallel не подойдет, запросов примерно 200-300, обрабатываются не постоянно а по таймеру ежедневно
Конечно же, Parallel.ForEachAsync из .NET 6. Там наконец-то сделали хорошо, и ты можешь контролировать степень параллельности.
пока выйдет нет6 меня возможно на этом проекте уже не будет)
https://www.nuget.org/packages/Open.ChannelExtensions/ возьми готовую надстройку над каналами. В примерах увидишь как подать массив и выставить паралелизм
спасибо
Для 200-300 это не 2-3, имеет смысл сделать контроль конкаренси. Можешь просто семафор использовать. Короче опции такие у тебя, от простого к сложному. Parallel.ForEachAsync ConcurrentQueue и джобы. Channel и джобы Semaphore
запусти таски через Task.Run и сделай whenAll. У тебя перф весь в IO сети упрётся один хер. Незачем городить сложное
Месяца через три тебя уже не будет, бро? Земля пухом :(
думаю чаннелы заюзать, спасибо
Да, и пусть потом отдел SRE через год огребает закончившиеся эфемеральные порты на тачке.
я имел ввиду что с проекта переведут
Троттлинг и для тасок делается несложно, зачем пальцы загибаешь?
Я не загибаю ничего. Проходил джуном абсолютно все варианты, которые можно вообразить. Ченелы дают сразу масштабируемую модель, которая стыкуется обоими концами как хочешь. Можно 1 ко многим, 1 к 1, много к 1 и многие ко многим продьюсеры и консумеры стыковать. Например, у тебя могут еще не дочитаться из базы все урлы, а реквесты уже пошли.
Странно тогда, что предлагаешь внутри тасок использовать семафоры тогда.
Почему тебе кажется странным? Ты сам это предлагал.
Нет, конкретно семафор внутри тасок я не предлагал. Если тебе не кажется этот подход странным, то 🤷♂
Мне уже интересно, как еще ты предлагал использовать семафор, если таски не входят и не выходят из него? Как вообще его можно использовать иначе?
А что за чэнелы? Мог бы тыкнуть в мат часть
https://habr.com/ru/post/508726/
Обсуждают сегодня