170 похожих чатов

Стивен Клири в своей книге Concurrency in .NET пишет что

для параллельных i/o операций лучше использовать массив тасок с Task.WhenAll вместо Parallel.ForEach, а в первом ответе по этой ссылке чел говорит что Task.WhenAll создаст много ненужных тасок что плохо повлияет на перф. У меня есть массив урлов по которым нужно ходить параллельно что для этого лучше использовать?

22 ответов

25 просмотров

Подождать нет6 можешь там завезли паралел асинк, в текущий реалиях массив тасок но ты можешь управлять набором активный накидыв сверху кода, или заюзать через я ченелы пайплан и там тоже можно управлять конкаренси

Зависит от кардинальности этого "массива урлов". Если это 2-3 урла, можно хоть whenall хоть parallel. Если у тебя постоянно обрабатываются новые урлы, то нужно регулировать степень параллелизма. Это организуется с помощью фиксированного количества джобов, которые в цикле вычитывают очередь.

Bekzhan-Bubakanov Автор вопроса

net6 ждать не могу, про channel'ы почитаю спасибо

Bekzhan-Bubakanov Автор вопроса

проблема в том что запросы асинковые поэтому parallel не подойдет, запросов примерно 200-300, обрабатываются не постоянно а по таймеру ежедневно

Конечно же, Parallel.ForEachAsync из .NET 6. Там наконец-то сделали хорошо, и ты можешь контролировать степень параллельности.

Bekzhan-Bubakanov Автор вопроса

пока выйдет нет6 меня возможно на этом проекте уже не будет)

https://www.nuget.org/packages/Open.ChannelExtensions/ возьми готовую надстройку над каналами. В примерах увидишь как подать массив и выставить паралелизм

Bekzhan-Bubakanov Автор вопроса

спасибо

Для 200-300 это не 2-3, имеет смысл сделать контроль конкаренси. Можешь просто семафор использовать. Короче опции такие у тебя, от простого к сложному. Parallel.ForEachAsync ConcurrentQueue и джобы. Channel и джобы Semaphore

запусти таски через Task.Run и сделай whenAll. У тебя перф весь в IO сети упрётся один хер. Незачем городить сложное

Месяца через три тебя уже не будет, бро? Земля пухом :(

Bekzhan-Bubakanov Автор вопроса

думаю чаннелы заюзать, спасибо

Да, и пусть потом отдел SRE через год огребает закончившиеся эфемеральные порты на тачке.

Bekzhan-Bubakanov Автор вопроса

я имел ввиду что с проекта переведут

Троттлинг и для тасок делается несложно, зачем пальцы загибаешь?

Я не загибаю ничего. Проходил джуном абсолютно все варианты, которые можно вообразить. Ченелы дают сразу масштабируемую модель, которая стыкуется обоими концами как хочешь. Можно 1 ко многим, 1 к 1, много к 1 и многие ко многим продьюсеры и консумеры стыковать. Например, у тебя могут еще не дочитаться из базы все урлы, а реквесты уже пошли.

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

Почему тебе кажется странным? Ты сам это предлагал.

Нет, конкретно семафор внутри тасок я не предлагал. Если тебе не кажется этот подход странным, то 🤷‍♂

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

А что за чэнелы? Мог бы тыкнуть в мат часть

https://habr.com/ru/post/508726/

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

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта