powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# MultiThreading
25 сообщений из 27, страница 1 из 2
C# MultiThreading
    #39589616
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Есть задача запускать в консольном приложении функцию параллельными потоками с предельным уровнем параллелизма, допустим 20. То есть, чтобы одновременно не более 20 потоков.
Как сделал я:
Код: 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.
int                 threadsCount;
static readonly object syncLock = new object();

        public static void Wait(double seconds)
        {
            int ticks = System.Environment.TickCount + (int)Math.Round(seconds * 1000.0);
            while (System.Environment.TickCount < ticks)
            {
                Application.DoEvents();
            }
        }

        private static void FilterGetRatings()
        {
threadsCount = 0;
int MaxPage = 100;
int MaxDegree = 20;

                for (int j = 1; j <= MaxPage; j++)
                {
                    threadsCount++;
                    Thread ths = new Thread(() => FilterGetRating(j));
                    ths.Start();

// Жду когда освободится поток                    
                    while (threadsCount >= MaxDegree)
                    {
                        Wait(1.0);
                    }
                     
                }
// Жду пока все потоки доработают
                while (threadsCount > 0)
                {
                    Wait(1.0);
                }
}

private static void FilterGetRating(int i)
        {
            //что-то делается

            lock (syncLock)
            {
                threadsCount--;
            }
        }



Оно всё работает, но адски грузится проц. Даже на двух потоках четырехядерный процессор под плешку. Есть подозрение, что это из-за моего топорного способа синхронизации и ожидания потоков.
И есть сильное подозрение, что это можно сделать проще. Читал про Task[], но не понял как в нем сделать ограничение одновременного числа потоков.
Направьте на путь истинный или киньте примером хотя бы.
...
Рейтинг: 0 / 0
C# MultiThreading
    #39589653
Pu4koff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Parallel.For не пойдёт?
...
Рейтинг: 0 / 0
C# MultiThreading
    #39589656
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oblom,

В пуле потоков ставите 20 и task.run(.
Но там вроде 20 уже и так стоит)))))
...
Рейтинг: 0 / 0
C# MultiThreading
    #39589658
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OblomЧитал про Task[],а вы запустите.
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590310
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Oblom,

В пуле потоков ставите 20 и task.run(.

А как, в этом и вопрос? )) Можно просто свойство указать, дальше буду с гуглом общаться ))
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590316
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pu4koffParallel.For не пойдёт?
Не нашел как ограничить число одновременных потоков, там просто начальное и конечные значения плюс делегат на выполняемую функцию, других параметров нет.
А мне надо, чтобы делегат выполнился от 1 до 100 раз, но при этом одновременно не более чем в N параллельных потоков
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590317
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oblom,
Ну там примерно около 20. Вам ровно ровно надо?
Я и не заморачивался.
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590319
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Oblom,
Ну там примерно около 20. Вам ровно ровно надо?
Я и не заморачивался.

Да, хочу регулировать количество от внешних условий
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590329
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
где то в этом разделе кидал пример шадулера, с помощью которого можно задать количество одновременно выполняющихся потоков и закидать его тасками. как вариант, не самый элегантный, но боевой и рабочий :)
пример этот есть и на сайте MS
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590333
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oblom,
Ок. Я не перфекционист.
Там менеджер потоков очень крутой.
Учитывает кучу условий и не даст машине тормозить.
Я грузил 100 задач и около 20 было всегда максимум.
Удачи!
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590345
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesгде то в этом разделе кидал пример шадулера, с помощью которого можно задать количество одновременно выполняющихся потоков и закидать его тасками. как вариант, не самый элегантный, но боевой и рабочий :)
пример этот есть и на сайте MS

У вас слишком много тем, боюсь не найду ))) Попробую найти на MS
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590361
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590363
Pu4koff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OblomPu4koffParallel.For не пойдёт?
Не нашел как ограничить число одновременных потоков, там просто начальное и конечные значения плюс делегат на выполняемую функцию, других параметров нет.
А мне надо, чтобы делегат выполнился от 1 до 100 раз, но при этом одновременно не более чем в N параллельных потоков
там есть несколько вариантов перегрузки метода В том числе можно задать ParallelOptions, а там есть MaxDegreeOfParallelism.
Это правда больше про таски, а не потоки, но потоки побочно тоже ограничиваются.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    class Program
    {
        static int Tasks;

        static void MyFunc(int i)
        {
            System.Threading.Interlocked.Increment(ref Tasks);
            System.Threading.Thread.Sleep(2000);
            Console.WriteLine($"ThreadId: {System.Threading.Thread.CurrentThread.ManagedThreadId},\tparallelism: {Tasks},\tvalue: {i}");
            System.Threading.Interlocked.Decrement(ref Tasks);
        }

        static void Main(string[] args)
        {
            Parallel.For(0, 1000, new ParallelOptions { MaxDegreeOfParallelism = 20 }, (i) => MyFunc(i));
            Console.WriteLine("Done!");
            Console.ReadKey();
        }
    }
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590364
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант - ThreadPool.SetMaxThreads
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590368
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRКак вариант - ThreadPool.SetMaxThreads
Это который по умолчанию?
Тогда всё. Какой ещё код нужен?
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590379
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123LRКак вариант - ThreadPool.SetMaxThreads
Это который по умолчанию?
Тогда всё. Какой ещё код нужен?

Насколько я понял Tasks[] и ThreadPool даже из разных фреймворков )))
И вроде как Tasks[] прогрессивнее, чем ThreadPool
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590380
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pu4koffOblomпропущено...

Не нашел как ограничить число одновременных потоков, там просто начальное и конечные значения плюс делегат на выполняемую функцию, других параметров нет.
А мне надо, чтобы делегат выполнился от 1 до 100 раз, но при этом одновременно не более чем в N параллельных потоков
там есть несколько вариантов перегрузки метода В том числе можно задать ParallelOptions, а там есть MaxDegreeOfParallelism.
Это правда больше про таски, а не потоки, но потоки побочно тоже ограничиваются.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    class Program
    {
        static int Tasks;

        static void MyFunc(int i)
        {
            System.Threading.Interlocked.Increment(ref Tasks);
            System.Threading.Thread.Sleep(2000);
            Console.WriteLine($"ThreadId: {System.Threading.Thread.CurrentThread.ManagedThreadId},\tparallelism: {Tasks},\tvalue: {i}");
            System.Threading.Interlocked.Decrement(ref Tasks);
        }

        static void Main(string[] args)
        {
            Parallel.For(0, 1000, new ParallelOptions { MaxDegreeOfParallelism = 20 }, (i) => MyFunc(i));
            Console.WriteLine("Done!");
            Console.ReadKey();
        }
    }



А вот это похоже то, что нужно. Спасибо, буду пробовать прикручивать!
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590383
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OblomPetro123пропущено...

Это который по умолчанию?
Тогда всё. Какой ещё код нужен?

Насколько я понял Tasks[] и ThreadPool даже из разных фреймворков )))
И вроде как Tasks[] прогрессивнее, чем ThreadPool
Забавное понимание)))
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590385
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LROblomпропущено...


Насколько я понял Tasks[] и ThreadPool даже из разных фреймворков )))
И вроде как Tasks[] прогрессивнее, чем ThreadPool
Забавное понимание)))

Ну Tasks[] появились вроде как с 4-го и стали развитием ThreadPool, но могу и ошибаться, я не большой специалист не то что в многопоточности, а и в самом C# ))
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590387
Pu4koff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OblomPetro123пропущено...

Это который по умолчанию?
Тогда всё. Какой ещё код нужен?

Насколько я понял Tasks[] и ThreadPool даже из разных фреймворков )))
И вроде как Tasks[] прогрессивнее, чем ThreadPool
Task и Thread - разные вещи.
В общем случае при создании Thread создаётся нативный поток операционки. Это долго, дорого и не увлекательно. Потому придумали пул потоков ThreadPool. И даже так это вышло долго, дорого и не увлекательно, поэтому еще придумали таски. Что-то похожее на менеджер потоков из ОС замутили свой, но для тасков. Соответственно работа с тасками дешевле обходится, чем с потоками. В итоге несколько параллельных тасков могут выполняться в одном потоке, а могут в разных. Соответственно при запуске 10 параллельных тасков можно сказать, что там работает не более 10 потоков, но может быть он и один по факту.
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590389
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OblomНу Tasks[] появились вроде как с 4-го и стали развитием ThreadPool, но могу и ошибаться, я не большой специалист не то что в многопоточности, а и в самом C# ))
Заментно, что не (большой) специалист, если хотите стать - читайте документацию/разбирайтесь, если нет - тогда, конечно, проще что-то "прикрутить"...
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590397
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oblom,
Главное кода в строчках побольше и пулом Поуправлять по внешним факторам.
Ну, мороз там, или слякоть.
Работайте! Успехов.
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590404
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Oblom,
Главное кода в строчках побольше и пулом Поуправлять по внешним факторам.
Ну, мороз там, или слякоть.
Работайте! Успехов.

Ну или разное количество доступных прокси-серверов, для каждого из которых свой поток.
Спасибо и вам удач!
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590469
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Task это просто задача, которая либо возвращает результаты либо нет.
Никакого отношения к многопоточности, сам по себе Task не имеет, он имеет отношение к асинхронности.
Но если таски выполнять в пуле потоков, то конечно они будут "многопоточными".
уже 1000 раз тут эта тема поднималась
многопоточность и асинхронность совершенно разные вещи.
можно сделать синхронное выполнение в 2 потоках для 2 задач, а можно сделать асинхронное выполнение 2 задач в 1 потоке.
...
Рейтинг: 0 / 0
C# MultiThreading
    #39590489
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OblomНу или разное количество доступных прокси-серверов, для каждого из которых свой поток.
это я не понял.
Если желаете говорить, то тут есть профи - подскажут.
"В себе такие проблемы не держите" (с)
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# MultiThreading
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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