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


Вроде всё c 2012 года
...
Рейтинг: 0 / 0
26.10.2017, 14:25
    #39542492
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парралельный обход коллекции в строгом порядке с заданным числом потоков
Это я и имел ввиду про ручное управление, а через таски, await или другие классы (хоть через бэкграудворкеры) не имеет принципиальной разницы.
как написать я себе представляю: метод выдающий следующую дату из коллекции через лок-объект, функция создающая поток с обработкой должна быть рекурсивна пока есть даты в коллекции и функцию вызвать сразу нужно число раз = желаемому кол-ву потоков.
я просто думал что есть уже готовое решение в PLINQ или Parallel.* чтобы не изобретать велосипед.
...
Рейтинг: 0 / 0
26.10.2017, 14:29
    #39542499
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парралельный обход коллекции в строгом порядке с заданным числом потоков
или просто нужное кол-во потоков с функцией внутри которой цикл пока даты не кончались. даты через лок-объект возвращаются.
...
Рейтинг: 0 / 0
26.10.2017, 14:35
    #39542507
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парралельный обход коллекции в строгом порядке с заданным числом потоков
Ограничить количество потоков можно с помощью ThreadPool.SetMaxThreads (Int32, Int32)
...
Рейтинг: 0 / 0
26.10.2017, 15:33
    #39542576
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парралельный обход коллекции в строгом порядке с заданным числом потоков
Task'и + шедулер на 4 потока с очередью выполнения .
пример такого шедулера есть в MSDN:
https://msdn.microsoft.com/ru-ru/library/ee789351(v=vs.100).aspx
...
Рейтинг: 0 / 0
26.10.2017, 15:51
    #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
26.10.2017, 15:58
    #39542606
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парралельный обход коллекции в строгом порядке с заданным числом потоков
barrabas,
Я тебе дал 2 строки. Ты написал 100 строк с семафорами)))))
...
Рейтинг: 0 / 0
26.10.2017, 16:00
    #39542607
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парралельный обход коллекции в строгом порядке с заданным числом потоков
Dima TОграничить количество потоков можно с помощью ThreadPool.SetMaxThreads (Int32, Int32)
Да.
await как раз через него.
Только ему мешать не надо и ограничивать.
...
Рейтинг: 0 / 0
26.10.2017, 16:02
    #39542611
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парралельный обход коллекции в строгом порядке с заданным числом потоков
Petro123barrabas,
Я тебе дал 2 строки. Ты написал 100 строк с семафорами)))))
а я не понял, как задать у тебя кол-во потоков. в ThreadPool.SetMaxThreads есть ограничения которые мне не подходят. т.к. сама обработка будет в БД, а не на клиентской машине и нужно иметь возможность полностью управлять параллельностью, а не зависить от кол-ва процессоров на клиенте
...
Рейтинг: 0 / 0
26.10.2017, 16:02
    #39542612
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парралельный обход коллекции в строгом порядке с заданным числом потоков
barrabasчерез лок-объект,
Потокобезоп.коллекцию возьми.
...
Рейтинг: 0 / 0
26.10.2017, 16:04
    #39542617
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парралельный обход коллекции в строгом порядке с заданным числом потоков
barrabasа я не понял, как задать у тебя кол-во
Зачем?
Это пул потоков.
...
Рейтинг: 0 / 0
26.10.2017, 16:04
    #39542618
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парралельный обход коллекции в строгом порядке с заданным числом потоков
Petro123barrabas,
Я тебе дал 2 строки. Ты написал 100 строк с семафорами)))))
поэтому и спрашивал , т.к. не хотел изобретать велосипед, как сделать я знал и не один вариант.
...
Рейтинг: 0 / 0
26.10.2017, 16:06
    #39542620
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парралельный обход коллекции в строгом порядке с заданным числом потоков
barrabasобработка будет в БД,
В смысле? В сиквеле или Оракле?
...
Рейтинг: 0 / 0
26.10.2017, 16:07
    #39542621
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парралельный обход коллекции в строгом порядке с заданным числом потоков
barrabasPetro123barrabas,
Я тебе дал 2 строки. Ты написал 100 строк с семафорами)))))
поэтому и спрашивал , т.к. не хотел изобретать велосипед, как сделать я знал и не один вариант.
Тогда начни писать await, а то вопросы странные.
...
Рейтинг: 0 / 0
26.10.2017, 16:10
    #39542624
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парралельный обход коллекции в строгом порядке с заданным числом потоков
Petro123,

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


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