Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
3 / 4 / 1
Регистрация: 18.08.2017
Сообщений: 77

Parallel.ForEach и его неадекватное поведение

03.06.2018, 14:29. Показов 2040. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача простая. Я выполняю какие либо действия, в результате чего у меня появляется допустим огромный массив с данными, которые мне нужно обработать. В один поток это делать ну очень медленно, поэтому самым простым вариантом для себя взял Parallel.ForEach. Через треды можно, но проблема такая же как и здесь.

Вот допустим такой код
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
        //Проблемная функция
        public void Proga()
        {
            //Условный массив первичных данных
            List<string> list_str1 = new List<string>();
            //Заполняем первичный массив
            for (int i = 0; i <= 10000; ++i)
            {
                list_str1.Add(RandomString(5000));
            }
            //Высераем количество строк в листе
            Console.WriteLine("i ->" + list_str1.Count.ToString());
 
            //-------Вторичные данные
            List<string> list_str2 = new List<string>();
            //Вот тут уже весело
            Parallel.ForEach(list_str1, new ParallelOptions() { MaxDegreeOfParallelism = 20 }, l =>
            {
                list_str2.Add(l);
 
            });
            //высер количества вторичных
            Console.WriteLine("str ->" + list_str2.Count.ToString());
 
        }
        //Мутим рандомный текст, ничего интересного
        private Random random = new Random();
        public string RandomString(int length)
        {
            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            return new string(Enumerable.Repeat(chars, length)
              .Select(s => s[random.Next(s.Length)]).ToArray());
        }
В многопоточной проге я пытаюсь сохранить все результаты в одну переменную. В виде массива, в одну строку, в виде класса пробовал, но получается одна и та же хрень. Вот такой у меня получается вывод:

PERV ->10001
VTOR ->7946

То есть я как понимаю, когда в 20 потоков я пытаюсь запихнуть с лист инфу, часть запросов нафиг вообще не выполняется.
А когда речь идет об огромных html страницах в текстовой переменной, так там из 40 страниц добавляется только 5.

Как поделить эту дичь? Я уже три для бадаюсь с этим си шарпом, он пока побеждает.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.06.2018, 14:29
Ответы с готовыми решениями:

Распараллеливание. Parallel.ForEach
На данный момент выполняется такой код: Hashtable files2copy; void startButton_Click(object sender, RoutedEventArgs e) { ...

Parallel.ForEach эффективное использование
Хотелось бы услышать реальный опыт использования параллельных циклов и плюсы от использования, если они есть. Как я понимаю такие циклы...

Pause и Resume в Parallel.Foreach
Сделал пробный проект, в котором идет просто вывод переменной из List&lt;int&gt;. При нажатии на кнопку Button2 переменной isPaused...

6
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
03.06.2018, 14:42
Про синхронизацию потоков, lock'и и т.д. вы видимо не слышали... Без этого нельзя обращаться ко всяким спискам и т.д. сразу из нескольких потоков.
0
3 / 4 / 1
Регистрация: 18.08.2017
Сообщений: 77
03.06.2018, 14:48  [ТС]
блин вы серьёзно?... я три дня бадался с этой херью, пробовал через базу данных sql sever всё это проворачивать... она зависала нафиг от 30 запросов одновременных...

А ВСЕГО ЛИШЬ НАДО БЫЛО ПРОПИСАТЬ ЛОКЕР!
Короче получился такой код, всё работает, спасибо вам за всё
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
        object locker = new object();
        //Проблемная функция
        public void Proga()
        {
            //Условный массив первичных данных
            List<string> list_str1 = new List<string>();
            //Заполняем первичный массив
            for (int i = 0; i <= 10000; ++i)
            {
                list_str1.Add(RandomString(50000));
            }
            //Высераем количество строк в листе
            Console.WriteLine("PERV ->" + list_str1.Count.ToString());
 
            //Вторичные данные
            List<string> list_str2 = new List<string>();
            //Вторичная обработка
            Parallel.ForEach(list_str1, new ParallelOptions() { MaxDegreeOfParallelism = 20 }, l =>
            {
                lock (locker)
                {
                    list_str2.Add(l.ToString());
                }
                //list_str2.Add(l.ToString());
 
            });
            //высер вторичных
            Console.WriteLine("VTOR ->" + list_str2.Count.ToString());
 
        }
0
Эксперт .NET
 Аватар для Usaga
14088 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,929
03.06.2018, 14:55
Царь Руси, код выше - тупо синхронный. С таким же успехом можно было и в один поток всё сделать.

И да, Someone007 вам правильные слова назвал. Почитайте про примитивы синхронизации.
0
3 / 4 / 1
Регистрация: 18.08.2017
Сообщений: 77
03.06.2018, 14:59  [ТС]
Это здесь он синхронный. У меня другая задача и она не покатит никак в один поток. Там надо загрузить огромную тучу html страниц и вынуть от туда данные. Все алгоритмы готовы, а встрял на какой то сраной переменной
0
Эксперт .NET
 Аватар для Usaga
14088 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,929
03.06.2018, 15:04
Ну так разбейте задачу на потоки, которые результат будут складывать каждый в свою отдельную коллекцию. А по завершению работы все эти коллекции объедините в одну. И всё. Никакой синхронизации не надо.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
04.06.2018, 08:48
Цитата Сообщение от Царь Руси Посмотреть сообщение
А ВСЕГО ЛИШЬ НАДО БЫЛО ПРОПИСАТЬ ЛОКЕР!
Я лет 15 назад в Делфи когда хотел делать многопоточность, то первое что прочитал в книжках - это именно про локеры. Без теории как-то лезть в весьма серьезный аспект программирования я бы не стал. Так же не ясно почему SQL у вас упал от 30 запросов, я как раз 15 лет назад на Селерон 300А с LocalBDE писал код, там в секунду было около 150 запросов, HDD конечно напрягался, но всё работало. А с сегодняшними мощностями, когда на одном ПК легко крутится 4-6 виртуалок мне трудно представить падение SQL от 30 запросов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.06.2018, 08:48
Помогаю со студенческими работами здесь

Parallel.Foreach изменение коллекции
Если коллекция Dictionary&lt;string,Class&gt; dic; Первый поток добавляет и удаляет элементы из коллекции используя Parallel.Foreach Второй...

PLINQ или Parallel.ForEach?
Пытаюсь сообразить как лучше сделать задачку. Есть большой список EXCEL файлов и мне надо их считать проделать некоторые операции (все...

Parallel.ForEach что не верно? Не компилируется
class Program { static void Main(string args) { ParallelOptions parOpt = new ParallelOptions(); ...

Parallel foreach ожидание для каждого потока
Добрый день. Есть Parallel.ForEach, который внутри себя вызывает json запрос на сервер. Parallel.ForEach(arr, v =&gt; { ...

Сравнение списков Parallel.ForEach неадекватный результат
Сравниваю два списка, возвращаю первое совпадение. Но возвращаемое значение всегда разное при одинаковых списках. В чем может заключаться...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru