powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как делать кучу параллельных IO-Bound операций ?
25 сообщений из 57, страница 1 из 3
Как делать кучу параллельных IO-Bound операций ?
    #39689035
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то ищу информацию, и похоже ни 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 - вот он мол умеет работать. Но в тоже время является очень тяжеловесным решением.


Так какой выход на текущем временном отрезке ?
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689062
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,

1. Почему бы всю работу не сделать в БД?
2. Если у тебя 99,999% времени есть ожидание БД, а остальное обработка в приложении, то имеет смысл проверить, будет ли польза от параллельного обращение к БД, возможно встрянешь еще сильнее по скорости.
3. Если все же есть смысл ходить в БД параллельно, то просто запусти 10-100 потоков, пусть ждут наздоровье.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689064
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ,

В том и суть. что нужно сделать в несколько потоков. Распараллелить и загрузить бд работой.
Бд же не умеет в несколько потоков работать ?
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689066
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ,

ну собственно я и хочу запустить 100 потоков - но, это правильно делать через async/await. А непосредственно генерацией этих сотен потоков занимаются PLINQ и Parallel. Но созданы они давно, и, как я понял, мелкософты не удосужились добавить в них поддержку async/await. А без них создавать сотни IO-Bound задач уже не комильфо.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689067
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreБд же не умеет в несколько потоков работать ?
Ну тут смотря какая БД у тебя, odbc driver for dbf скорее всего не умеет :)
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689069
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ms sql.
Я имел ввиду - что я же не могу внутри T-SQL написать код который будет параллелить. Нету такого функционала в принципе. Это в C# я могу создавать потоки вручную, как и сколько мне надо.

Я могу лишь запустить сотню потоков работающих с бд из клиентского приложения.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689073
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreЕвгенийВ,

ну собственно я и хочу запустить 100 потоков - но, это правильно делать через async/await. А непосредственно генерацией этих сотен потоков занимаются PLINQ и Parallel. Но созданы они давно, и, как я понял, мелкософты не удосужились добавить в них поддержку async/await. А без них создавать сотни IO-Bound задач уже не комильфо.
Исторически TPL была создана раньше async/await для распараллеливания вычислений, последние же нужны для асинхронности.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689074
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ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. Они могут только работать по неправильному пути.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689076
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ,

Конечно TPL появилось раньше async/await.
Странно лишь то, что умные головы из Microsoft не добавляют поддержку в PLINQ и Parallel поддержку методов вида Parallel.ForEachAsync. При том что это сделали для любых маломальских классов типа File.GetAllTextAsync и прочего сразу с вводом async/await. Не пойму почему.

И даже альтернативы то не сделали. Кроме огромнейшего TPL Dataflow. Тянуть его в проект ради того, чтобы один раз воспользоватся аналогом Parallel.ForEachAsync как-то не хочется.

Вот и ищу, может есть какие-то другие альтернативы ? Кроме самописных велосипедов...
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689077
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCorems sql.
Я имел ввиду - что я же не могу внутри T-SQL написать код который будет параллелить.
Ну почему же, можешь !

В T-SQL что делать решает оптимизатор и каждый простенький запрос может обслуживаться кучей потоков.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689083
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ,

Если я правильно понимаю тут речь о распараллеливании селекта.
А мне нужно запустить некую T-SQL процедуру в нескольких экземлярах.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689084
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,
Сколько понаписал то.
Внутри потока создавай коннект и работай.
В чем проблема?
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689085
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore При том что это сделали для любых маломальских классов типа File.GetAllTextAsync и прочего сразу с вводом async/await. Не пойму почему.


Это для тех случаев, когда Cpu-Bound не хватает, например в web highload приложении или для ГУЯ, дабы не блокировать его и не сильно напрягать программистов для этого.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689088
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreЕвгенийВ,

Если я правильно понимаю тут речь о распараллеливании селекта.
А мне нужно запустить некую T-SQL процедуру в нескольких экземлярах.
Грубо говоря, если ты запустишь несколько раз долгоиграющую процедуру из разных окон например SSMS, то все запущенные будут исполняться параллельно.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689091
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreА тут пишут, что класс Parallel тоже не в курсе про async
https://stackoverflow.com/a/11565317
и там же предлагают задействовать TPL Dataflow - вот он мол умеет работать. Но в тоже время является очень тяжеловесным решением.

Там ниже предлагаются варианты на все возможные случаи "замеса" параллельности и асинхронности - RunWithMaxDegreeOfConcurrency и ForEachAsync.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689093
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRТам ниже предлагаются варианты на все возможные случаи "замеса" параллельности и асинхронности - RunWithMaxDegreeOfConcurrency и ForEachAsync.
...и еще ниже - ParallelForEachAsync
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689097
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreне правильный это Task.Run (()=> SqlConnection.Query<Model>).
Правильный:
Task.Run(()=> MyMetodAsync()
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689118
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,

Кажется, что вы смешали мухи с котлетами.

Чтобы понять где косяк, надо просто понять одну простую вещь.
Код с асинхронными вызовами с точки зрения execution flow абсолютно синхронный.

В тоже время TPL это параллельный execution flow, поэтому "уметь" async он не должен.
Вполне достаточно WhenAll, который умеет await.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689143
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
    /// <summary>
    /// Concurrently Executes async actions for each item of <see cref="IEnumerable<typeparamref name="T"/>
    /// </summary>
    /// <typeparam name="T">Type of IEnumerable</typeparam>
    /// <param name="enumerable">instance of <see cref="IEnumerable<typeparamref name="T"/>"/></param>
    /// <param name="action">an async <see cref="Action" /> to execute</param>
    /// <param name="maxDegreeOfParallelism">Optional, An integer that represents the maximum degree of parallelism,
    /// Must be grater than 0</param>
    /// <returns>A Task representing an async operation</returns>
    /// <exception cref="ArgumentOutOfRangeException">If the maxActionsToRunInParallel is less than 1</exception>
    public static async Task ForEachAsyncConcurrent<T>(
        this IEnumerable<T> enumerable,
        Func<T, Task> action,
        int? maxDegreeOfParallelism = null)
    {
        if (maxDegreeOfParallelism.HasValue)
        {
            using (var semaphoreSlim = new SemaphoreSlim(
                maxDegreeOfParallelism.Value, maxDegreeOfParallelism.Value))
            {
                var tasksWithThrottler = new List<Task>();

                foreach (var item in enumerable)
                {
                    // Increment the number of currently running tasks and wait if they are more than limit.
                    await semaphoreSlim.WaitAsync();

                    tasksWithThrottler.Add(Task.Run(async () =>
                    {
                        await action(item);

                        // action is completed, so decrement the number of currently running tasks
                        semaphoreSlim.Release();
                    }));
                }

                // Wait for all tasks to complete.
                await Task.WhenAll(tasksWithThrottler.ToArray());
            }
        }
        else
        {
            await Task.WhenAll(enumerable.Select(item => action(item)));
        }
    }


Sample Usage:
Код: c#
1.
2.
3.
4.
5.
6.
await enumerable.ForEachAsyncConcurrent(
    async item =>
    {
        await SomeAsyncMethod(item);
    },
    5);

...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689148
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689150
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRНу а если элементов сотни, глупо же выполнять их на сотне потоков...

https://docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern#throttling
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689157
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt https://docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern#throttling
Ага, получается в документации эти вопросы рассмотрены, но кто ж ее читает)) И еще, если посмотреть в Task.WhenAny , с созданием копии списка задач, то вариант с семафором может получиться и побыстрее, х.з.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689161
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRНу а если элементов сотни, глупо же выполнять их на сотне потоков...
С чего их сотня если пул потоков по умолчанию настройка макс около 20 потоков.
Остальные ждать будут.
И писать ничего не надо.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689166
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123LRНу а если элементов сотни, глупо же выполнять их на сотне потоков...
С чего их сотня если пул потоков по умолчанию настройка макс около 20 потоков.
Остальные ждать будут.
И писать ничего не надо.
Ну какая разница, суть в другом - забирать все потоки из пула для одной задачи, если только она не единственная - глупо.
...
Рейтинг: 0 / 0
Как делать кучу параллельных IO-Bound операций ?
    #39689167
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRНу какая разница, суть в другом - забирать все потоки из пула для одной задачи, если только она не единственная - глупо.
суть нелогична.
Если задача одна - зачем параллелить?
Об чём топик?
Как хранимку распарралелить "чтобы было"?
...
Рейтинг: 0 / 0
25 сообщений из 57, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как делать кучу параллельных IO-Bound операций ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]