powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Парралельный обход коллекции в строгом порядке с заданным числом потоков
25 сообщений из 90, страница 1 из 4
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542364
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть коллекция с датами.
нужно выполнить процедуру для каждой даты в несколько потоков но в строгом порядке (сортировка по дате).
Т.е. запускается сразу 4 потока с датой 1,2,3,4, время выполнения разное, закончилась обработка 2, сразу началась 5 и т.д.
Есть ли стандартный метод в дотнете (PLINQ там всякий)? Или нужно самому управлять созданием нового потока?
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542368
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно Task использовать. https://metanit.com/sharp/tutorial/12.2.php
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542392
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabas,
Код: c#
1.
2.
Цикл даты
   await RunList (list)


Вроде всё c 2012 года
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542492
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я и имел ввиду про ручное управление, а через таски, await или другие классы (хоть через бэкграудворкеры) не имеет принципиальной разницы.
как написать я себе представляю: метод выдающий следующую дату из коллекции через лок-объект, функция создающая поток с обработкой должна быть рекурсивна пока есть даты в коллекции и функцию вызвать сразу нужно число раз = желаемому кол-ву потоков.
я просто думал что есть уже готовое решение в PLINQ или Parallel.* чтобы не изобретать велосипед.
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542499
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или просто нужное кол-во потоков с функцией внутри которой цикл пока даты не кончались. даты через лок-объект возвращаются.
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542507
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ограничить количество потоков можно с помощью ThreadPool.SetMaxThreads (Int32, Int32)
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542576
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Task'и + шедулер на 4 потока с очередью выполнения .
пример такого шедулера есть в MSDN:
https://msdn.microsoft.com/ru-ru/library/ee789351(v=vs.100).aspx
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542591
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да вроде накидал сейчас через семафор и таски
Код: 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.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
   static int _pcount = 0;
      static object _lock = new object();
      static SemaphoreSlim _semaphore;

      static int PCount
      {
         get
         {
            lock (_lock)
            {
               return ++_pcount;
            }
         }
      }

      class PTaskTestItem
      {
         public int OrderNum;
         public int SleepSec;
         public int RunNum;

         public PTaskTestItem(int orderNum, int sleepSec)
         {
            OrderNum = orderNum;
            SleepSec = sleepSec;
            RunNum = -1;
         }

         public override string ToString()
         {
            return string.Format("{0} - {1} [{2}]", OrderNum, RunNum, SleepSec);
         }
      }


     public void Test3()
      {
         var taskList = new List<PTaskTestItem>()
         {
            new PTaskTestItem(1, 10),
            new PTaskTestItem(2, 5),
            new PTaskTestItem(3, 3),
            new PTaskTestItem(4, 8),
            new PTaskTestItem(5, 12),
            new PTaskTestItem(6, 7),
            new PTaskTestItem(7, 10),
            new PTaskTestItem(8, 8),
            new PTaskTestItem(9, 10),
            new PTaskTestItem(10, 4),
            new PTaskTestItem(11, 1),
            new PTaskTestItem(12, 3),
            new PTaskTestItem(13, 10),
            new PTaskTestItem(14, 12),
            new PTaskTestItem(15, 11),
            new PTaskTestItem(16, 4),
            new PTaskTestItem(17, 7),
            new PTaskTestItem(18, 6),
            new PTaskTestItem(19, 10),
            new PTaskTestItem(20, 14),
         };
         var po = new ParallelOptions() { MaxDegreeOfParallelism = 4 };
         _semaphore = new SemaphoreSlim(0, po.MaxDegreeOfParallelism);
         /*
         //1
         var pTaskList = taskList.ToArray().
                  AsParallel().
                  AsOrdered().
                  Select(x =>
                  {
                     x.RunNum = PCount;
                     Thread.Sleep(x.SleepSec * 1000);
                     return x;
                  });
         foreach (var res in pTaskList) // Выполнение 
         {
            Debug.WriteLine(res.ToString());
         }
         */
         //2
         //Parallel.ForEach(taskList, po, (x) =>
         //{
         //   x.RunNum = PCount;
         //   Thread.Sleep(x.SleepSec * 1000);
         //   Debug.WriteLine(x.ToString());
         //});

         //3


         var tasks = new Task[taskList.Count];
         for (int i = 0; i < taskList.Count; i++)
         {
            tasks[i] = Task.Run(() =>
            {
               _semaphore.Wait();
               var n = PCount;
               var x = taskList.FirstOrDefault(f => f.OrderNum == n);               
               x.RunNum = n;
               Thread.Sleep(x.SleepSec * 1000);
               Debug.WriteLine(x.ToString());
               _semaphore.Release();
            });
         }
         _semaphore.Release(po.MaxDegreeOfParallelism);
         Task.WaitAll(tasks);
}
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542606
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabas,
Я тебе дал 2 строки. Ты написал 100 строк с семафорами)))))
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542607
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TОграничить количество потоков можно с помощью ThreadPool.SetMaxThreads (Int32, Int32)
Да.
await как раз через него.
Только ему мешать не надо и ограничивать.
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542611
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123barrabas,
Я тебе дал 2 строки. Ты написал 100 строк с семафорами)))))
а я не понял, как задать у тебя кол-во потоков. в ThreadPool.SetMaxThreads есть ограничения которые мне не подходят. т.к. сама обработка будет в БД, а не на клиентской машине и нужно иметь возможность полностью управлять параллельностью, а не зависить от кол-ва процессоров на клиенте
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542612
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabasчерез лок-объект,
Потокобезоп.коллекцию возьми.
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542617
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabasа я не понял, как задать у тебя кол-во
Зачем?
Это пул потоков.
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542618
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123barrabas,
Я тебе дал 2 строки. Ты написал 100 строк с семафорами)))))
поэтому и спрашивал , т.к. не хотел изобретать велосипед, как сделать я знал и не один вариант.
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542620
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabasобработка будет в БД,
В смысле? В сиквеле или Оракле?
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542621
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabasPetro123barrabas,
Я тебе дал 2 строки. Ты написал 100 строк с семафорами)))))
поэтому и спрашивал , т.к. не хотел изобретать велосипед, как сделать я знал и не один вариант.
Тогда начни писать await, а то вопросы странные.
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542624
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

при чем тут await вообще?
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542630
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123barrabasчерез лок-объект,
Потокобезоп.коллекцию возьми.
ну да, можно и ConcurrentQueue конечно, ихмо не принципиально и тяжелее объект, там большая часть функционала не нужна мне в данной случае. внутри там такой-же лок
меня именно запуск интересовал в нужной последовательности с заданным кол-вом потоков, остальное
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542632
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Он управляет очерёдностью.
Внутри task.run ставит в пул потоки.
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542634
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabasихмо не принципиально
Принципиален лаконичный код. Если нужно, на лямбдах.
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542636
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123barrabasобработка будет в БД,
В смысле? В сиквеле или Оракле?
а есть принципиальная разница для данной темы? в данном случае в оракле, но с тем же успехом можно заменить на сторонний webservice. смысл что реальная тяжелая обработка происходит удалённо и не должна зависеть от параметров запускающей машины.
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542640
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123barrabasихмо не принципиально
Принципиален лаконичный код. Если нужно, на лямбдах.
отладка неудобна :), некуда брейкпоинт поставить
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542647
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabas,
В оракле JOB на своём ЯП.
Делай.
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542650
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabas,
Какие бряки в потоках? ))
...
Рейтинг: 0 / 0
Парралельный обход коллекции в строгом порядке с заданным числом потоков
    #39542652
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Roman Mejtes,
Он управляет очерёдностью.
Внутри task.run ставит в пул потоки.
если не сложно, измени мой пример, я больше plsql занимаюсь и "новые" фишки дотнета не сильно юзаю, по верхам прочитал, но что-то не складывается как можно через await решить с точным заданием кол-ва потоков.
...
Рейтинг: 0 / 0
25 сообщений из 90, страница 1 из 4
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Парралельный обход коллекции в строгом порядке с заданным числом потоков
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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