|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
Что-то ищу информацию, и похоже ни PLINQ ни Parallel не умеют работать с async вызовами. Мне нужно выполнить работу, которая включает в себя кучу последовательных обращений к БД, с мелкой обработкой промежуточных результатов. Т.е. куча IO Bound операций с маленькой каплей Cpu-Bound. Ну к примеру вот тут пишут про PLINQ не умеет async (ответ дан 5 дней назад) https://stackoverflow.com/a/51600479 It does not matter, that you try to await the AsyncTask(), because ForAll() gets a plain Action and does not await the result of your AsyncTask(). А тут пишут, что класс Parallel тоже не в курсе про async https://stackoverflow.com/a/11565317 и там же предлагают задействовать TPL Dataflow - вот он мол умеет работать. Но в тоже время является очень тяжеловесным решением. Так какой выход на текущем временном отрезке ? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 17:39 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
WaspNewCore, 1. Почему бы всю работу не сделать в БД? 2. Если у тебя 99,999% времени есть ожидание БД, а остальное обработка в приложении, то имеет смысл проверить, будет ли польза от параллельного обращение к БД, возможно встрянешь еще сильнее по скорости. 3. Если все же есть смысл ходить в БД параллельно, то просто запусти 10-100 потоков, пусть ждут наздоровье. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:23 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
ЕвгенийВ, В том и суть. что нужно сделать в несколько потоков. Распараллелить и загрузить бд работой. Бд же не умеет в несколько потоков работать ? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:24 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
ЕвгенийВ, ну собственно я и хочу запустить 100 потоков - но, это правильно делать через async/await. А непосредственно генерацией этих сотен потоков занимаются PLINQ и Parallel. Но созданы они давно, и, как я понял, мелкософты не удосужились добавить в них поддержку async/await. А без них создавать сотни IO-Bound задач уже не комильфо. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:27 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
WaspNewCoreБд же не умеет в несколько потоков работать ? Ну тут смотря какая БД у тебя, odbc driver for dbf скорее всего не умеет :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:27 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
ms sql. Я имел ввиду - что я же не могу внутри T-SQL написать код который будет параллелить. Нету такого функционала в принципе. Это в C# я могу создавать потоки вручную, как и сколько мне надо. Я могу лишь запустить сотню потоков работающих с бд из клиентского приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:30 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
WaspNewCoreЕвгенийВ, ну собственно я и хочу запустить 100 потоков - но, это правильно делать через async/await. А непосредственно генерацией этих сотен потоков занимаются PLINQ и Parallel. Но созданы они давно, и, как я понял, мелкософты не удосужились добавить в них поддержку async/await. А без них создавать сотни IO-Bound задач уже не комильфо. Исторически TPL была создана раньше async/await для распараллеливания вычислений, последние же нужны для асинхронности. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:34 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
ЕвгенийВ3. Если все же есть смысл ходить в БД параллельно, то просто запусти 10-100 потоков, пусть ждут наздоровье. Собственно тут есть два пути - правильный и не правильный. не правильный это Task.Run (()=> SqlConnection.Query<Model>). В этом случае потоки будут простаивать в момент этого самого Query (пользуясь терминологией Dapper.Net). правильно это что-то типа Parallel.ForEach (async x=> await SqlConnection.QueryAsync<Model>). В этом случае потоки будут освобождены на время QueryAsync. Но беда в том, что, как я понял, Parallel.ForEach (и Plinq) не знаю про async/await. Они могут только работать по неправильному пути. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:34 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Конечно TPL появилось раньше async/await. Странно лишь то, что умные головы из Microsoft не добавляют поддержку в PLINQ и Parallel поддержку методов вида Parallel.ForEachAsync. При том что это сделали для любых маломальских классов типа File.GetAllTextAsync и прочего сразу с вводом async/await. Не пойму почему. И даже альтернативы то не сделали. Кроме огромнейшего TPL Dataflow. Тянуть его в проект ради того, чтобы один раз воспользоватся аналогом Parallel.ForEachAsync как-то не хочется. Вот и ищу, может есть какие-то другие альтернативы ? Кроме самописных велосипедов... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:38 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
WaspNewCorems sql. Я имел ввиду - что я же не могу внутри T-SQL написать код который будет параллелить. Ну почему же, можешь ! В T-SQL что делать решает оптимизатор и каждый простенький запрос может обслуживаться кучей потоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:38 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Если я правильно понимаю тут речь о распараллеливании селекта. А мне нужно запустить некую T-SQL процедуру в нескольких экземлярах. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:46 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
WaspNewCore, Сколько понаписал то. Внутри потока создавай коннект и работай. В чем проблема? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:47 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
WaspNewCore При том что это сделали для любых маломальских классов типа File.GetAllTextAsync и прочего сразу с вводом async/await. Не пойму почему. Это для тех случаев, когда Cpu-Bound не хватает, например в web highload приложении или для ГУЯ, дабы не блокировать его и не сильно напрягать программистов для этого. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:49 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
WaspNewCoreЕвгенийВ, Если я правильно понимаю тут речь о распараллеливании селекта. А мне нужно запустить некую T-SQL процедуру в нескольких экземлярах. Грубо говоря, если ты запустишь несколько раз долгоиграющую процедуру из разных окон например SSMS, то все запущенные будут исполняться параллельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 18:52 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
WaspNewCoreА тут пишут, что класс Parallel тоже не в курсе про async https://stackoverflow.com/a/11565317 и там же предлагают задействовать TPL Dataflow - вот он мол умеет работать. Но в тоже время является очень тяжеловесным решением. Там ниже предлагаются варианты на все возможные случаи "замеса" параллельности и асинхронности - RunWithMaxDegreeOfConcurrency и ForEachAsync. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 19:04 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
LRТам ниже предлагаются варианты на все возможные случаи "замеса" параллельности и асинхронности - RunWithMaxDegreeOfConcurrency и ForEachAsync. ...и еще ниже - ParallelForEachAsync ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 19:06 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
WaspNewCoreне правильный это Task.Run (()=> SqlConnection.Query<Model>). Правильный: Task.Run(()=> MyMetodAsync() ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 19:12 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
WaspNewCore, Кажется, что вы смешали мухи с котлетами. Чтобы понять где косяк, надо просто понять одну простую вещь. Код с асинхронными вызовами с точки зрения execution flow абсолютно синхронный. В тоже время TPL это параллельный execution flow, поэтому "уметь" async он не должен. Вполне достаточно WhenAll, который умеет await. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 19:58 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
hVosttВполне достаточно WhenAll, который умеет await. Ну а если элементов сотни, глупо же выполнять их на сотне потоков... Разумно приделать какое-то "горло". По второй ссылке из первого поста ТСа весьма привлекательным выглядит самое последнее решение, где горлышко организовано с помощью SemaphoreSlim ForEachAsyncConcurrentAn extension method for this which makes use of SemaphoreSlim and also allows to set maximum degree of parallelism Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
Sample Usage: Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 22:13 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
LR, Оставлю это здесь https://docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 22:39 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
LRНу а если элементов сотни, глупо же выполнять их на сотне потоков... https://docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern#throttling ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 22:41 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
hVostt https://docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern#throttling Ага, получается в документации эти вопросы рассмотрены, но кто ж ее читает)) И еще, если посмотреть в Task.WhenAny , с созданием копии списка задач, то вариант с семафором может получиться и побыстрее, х.з. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 23:05 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
LRНу а если элементов сотни, глупо же выполнять их на сотне потоков... С чего их сотня если пул потоков по умолчанию настройка макс около 20 потоков. Остальные ждать будут. И писать ничего не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 23:24 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
Petro123LRНу а если элементов сотни, глупо же выполнять их на сотне потоков... С чего их сотня если пул потоков по умолчанию настройка макс около 20 потоков. Остальные ждать будут. И писать ничего не надо. Ну какая разница, суть в другом - забирать все потоки из пула для одной задачи, если только она не единственная - глупо. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 23:31 |
|
Как делать кучу параллельных IO-Bound операций ?
|
|||
---|---|---|---|
#18+
LRНу какая разница, суть в другом - забирать все потоки из пула для одной задачи, если только она не единственная - глупо. суть нелогична. Если задача одна - зачем параллелить? Об чём топик? Как хранимку распарралелить "чтобы было"? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 23:39 |
|
|
start [/forum/topic.php?fid=20&fpage=28&tid=1399268]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
96ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 190ms |
0 / 0 |