20 / 37 / 9
Регистрация: 09.06.2015
Сообщений: 176
1

Многопоточность

10.10.2018, 12:35. Показов 1021. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую Всех.
Организовываю многопоточность вот таким образом

C#
1
2
3
4
5
public static void Poehali()
        {
            IEnumerable<object> collection = File.ReadAllLines("1.txt");
            Parallel.ForEach(collection, x => Method(x));
        }
но при передачи строк из файла 1.txt, часть строк не передаётся.
К примеру, если в файле 30000 строк., то в метод ушло где то 28700
Прошу подсказать, с чем это связано и как можно исправить

Добавлено через 29 минут
Единственное добавлю, что в консольном приложении работает норм., а когда сделал в виндовс форме, начались проблемы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2018, 12:35
Ответы с готовыми решениями:

Многопоточность
Доброго времени суток! Пишу довольно редко, самостоятельно не получилось разобраться:( Сразу...

Многопоточность
Здравствуйте. Есть два потока. Объясните пожалуйста, для чего выполнять вот такую проверку? Почему...

Многопоточность в C#
Уважаемые, программисты! Помогите, пожалуйста, реализовать пример с потоками. Мне нужно для...

Многопоточность
Всем привет, встала резко задача использования многопоточности без повторения переменных массива...

18
1406 / 1261 / 20
Регистрация: 09.08.2011
Сообщений: 2,321
Записей в блоге: 1
10.10.2018, 13:44 2
1.
Цитата Сообщение от Patlat Посмотреть сообщение
static void
не самое лучшее решение
2.
Цитата Сообщение от Patlat Посмотреть сообщение
Method(x)
предлагаете гадать на кофейной гуще что же у вас там делается? Насколько я помню нет стандартного метода Method(IEnumerable<object>).
1
Администратор
Эксперт .NET
16989 / 13348 / 5209
Регистрация: 17.03.2014
Сообщений: 27,294
Записей в блоге: 1
10.10.2018, 14:13 3
Цитата Сообщение от Patlat Посмотреть сообщение
К примеру, если в файле 30000 строк., то в метод ушло где то 28700
Как проверял?

Цитата Сообщение от V_Monomax Посмотреть сообщение
static void
не самое лучшее решение
Чем? Это же не async метод.
1
1406 / 1261 / 20
Регистрация: 09.08.2011
Сообщений: 2,321
Записей в блоге: 1
10.10.2018, 14:32 4
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Чем? Это же не async метод.
просто потому, что вы исключаете из потоко безопасных методы помеченные как статик, а это означает, что одновременно в одной области памяти может оказаться два разных значения, ну и конечно можно получить весьма ощутимое исключение при потоко не безопасном исполнении кода применяемого при работе с потоками. Ну и то что, здесь не говорится, это скорость работы со static в потоках, очень сильно снижается.
0
Администратор
Эксперт .NET
16989 / 13348 / 5209
Регистрация: 17.03.2014
Сообщений: 27,294
Записей в блоге: 1
10.10.2018, 14:46 5
V_Monomax, наличие или отсутствие модификатор static само по себе не влияет на потоко-безопасность метода. Также наличие static не приводит к ситуации когда "одновременно в одной области памяти может оказаться два разных значения". Тем более что приведенный код является однопоточным. Не помешает посмотреть как устроке метод Method, но в любом случае наличие static у Poehali на него не влияет.

Цитата Сообщение от V_Monomax Посмотреть сообщение
Ну и то что, здесь не говорится, это скорость работы со static в потоках, очень сильно снижается.
Каким образом модификатор static у метода может замедлить его скорость работы?
1
V_Monomax
10.10.2018, 15:14
  #6

Не по теме:

OwenGlendower, отвлекаемся от темы, если хотите то почитайте на мсдн, и на стаке видел несколько подробных статей про это дело. Да ипо собственному опыту, понимаю что статик не самое лучшее решение в абсолютном большинстве случае, поэтому в таких случаях, я себя спрашиваю, а должен ли метод быть статик, если для этого нет основания, то он должен быть не статичным. Но это моя точка зрения.

0
20 / 37 / 9
Регистрация: 09.06.2015
Сообщений: 176
10.10.2018, 15:52  [ТС] 7
Цитата Сообщение от V_Monomax Посмотреть сообщение
предлагаете гадать на кофейной гуще что же у вас там делается?
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Как проверял?
тут всё простенько

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
public static List<string> lis = new List<string>();
        public static int cjnt = 0;
 
        public static void Poehali()
        {
            IEnumerable<object> collection = File.ReadAllLines(@"1.txt");
            Parallel.ForEach(collection, x => Method(x));
 
        }
 
        public static void Method(object ob)
        {
            
            ++cjnt;
            try
            {
                byte[] buffer = Encoding.ASCII.GetBytes(ob.ToString());
                if (!lis.Contains(ob.ToString() + "," + Convert.ToBase64String(buffer)))
                {
                    lis.Add(ob.ToString() + "," + Convert.ToBase64String(buffer));
                }
 
            }
            catch
            {
 
            }
 
        }
Добавлено через 10 минут
в Method вообще можно всё убрать и оставить один счётчик., результат будет как говорил стартпосте
0
[Bicycle Reinventor]
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
10.10.2018, 15:57 8
Инкремент счетчика не синхронизирован между потоками, отчего и непредсказуемые результаты. Сделайте его volatile хотя бы.
1
20 / 37 / 9
Регистрация: 09.06.2015
Сообщений: 176
10.10.2018, 16:04  [ТС] 9
Цитата Сообщение от Exerion Посмотреть сообщение
Инкремент счетчика не синхронизирован между потоками, отчего и непредсказуемые результаты. Сделайте его volatile хотя бы.
у меня далее идёт выгрузка результата в файл., количество строк в файле, соответствует счётчику., тоесть, счётчик показывает адекватный результат

Добавлено через 1 минуту
так же я написал в стартпосте, что в консольном приложении работает идеально, хоть на 4кк строк
0
Эксперт .NET
10529 / 6457 / 1502
Регистрация: 25.05.2015
Сообщений: 19,579
Записей в блоге: 14
10.10.2018, 16:39 10
Patlat,
Цитата Сообщение от Patlat Посмотреть сообщение
List<string>
- не потокобезопасная коллекция, здесь так применять нельзя. Либо + семафоры, либо спец. коллекции.

Добавлено через 1 минуту
Цитата Сообщение от Patlat Посмотреть сообщение
так же я написал в стартпосте, что в консольном приложении работает идеально, хоть на 4кк строк
Значит, недостаточно хорошо тестировали.

Добавлено через 6 минут
См. System.Collections.Concurrent Namespace.
1
Администратор
Эксперт .NET
16989 / 13348 / 5209
Регистрация: 17.03.2014
Сообщений: 27,294
Записей в блоге: 1
10.10.2018, 17:09 11
Patlat, как уже было отмечено ты неправильно считаешь количество вызовов. В многопоточной среде следовало использовать метод Interlocked.Increment(ref int). Плюс коллекция List<T> не потоко-безопасна и нужно синхронизировать доступ к ней - что моментельно снизит скорость работы. В целом тут вообше мало пользы от многопоточности. В один поток будет проще и быстрее. И если не важен порядок строк, то можно использовать HashSet<string>
C#
1
2
3
4
5
6
7
8
9
10
11
public static List<string> lis = new List<string>();
 
public static void Poehali()
{
    var set = new HashSet<string>();
    foreach (string line in File.ReadLines(@"1.txt"))
    {
        set.Add(line + "," + Convert.ToBase64String(Encoding.ASCII.GetBytes(line)));
    }
    lis = set.ToList();
}
Цитата Сообщение от V_Monomax Посмотреть сообщение
отвлекаемся от темы
Ничего страшного

Цитата Сообщение от V_Monomax Посмотреть сообщение
если хотите то почитайте на мсдн, и на стаке видел несколько подробных статей про это дело.
Ссылки пожалуйста. Фразы "почитайте на MSDN" даже новичкам не следует писать без нормальной ссылки.

Цитата Сообщение от V_Monomax Посмотреть сообщение
Да ипо собственному опыту, понимаю что статик не самое лучшее решение в абсолютном большинстве случае, поэтому в таких случаях, я себя спрашиваю, а должен ли метод быть статик, если для этого нет основания, то он должен быть не статичным.
Мы все еще говорим про static и многопоточность или просто про static?
0
Эксперт .NET
1693 / 1322 / 316
Регистрация: 15.06.2012
Сообщений: 5,034
Записей в блоге: 3
10.10.2018, 17:33 12
Цитата Сообщение от Patlat Посмотреть сообщение
++cjnt;
ужс...

Цитата Сообщение от Patlat Посмотреть сообщение
счётчик показывает адекватный результат
ни разу. Вот вам пример

C#
1
2
3
            var i = 0;
            Parallel.ForEach(Enumerable.Repeat(1, 100000), x => i++);
            Console.WriteLine(i);
на каждый запуск будете получать рандомное число, близкое к 100000. Либо юзайте lock, либо Interlocked. К List<T> єто тоже имеет отношение.

Цитата Сообщение от Patlat Посмотреть сообщение
catch { }
Никогда не оставляйте исключения необработаными.

Цитата Сообщение от V_Monomax Посмотреть сообщение
не самое лучшее решение
на логику работы не влияет от слова "совсем". И да -- тоже первый раз слышу, что статика некое зло, в Рихтере помнится только про "медленость" виртуальных методов писалось.

p.s. собственно вьіше уже все расписали ^^
2
Модератор
Эксперт .NET
15456 / 10703 / 2784
Регистрация: 21.04.2018
Сообщений: 31,516
Записей в блоге: 2
10.10.2018, 18:31 13
Patlat, извиняюсь за вмешательство в такую оживлённую дискуссию. Но такой интерес - а для чего Вам многопоточность в этом решении? Это какая-то учебная задача для тренировки?
У Вашего решения узкое место не в обработке массива строк, а в чтении файла. От того что Вы записали IEnumerable<object> collection = File.ReadAllLines("1.txt"); - это не значит что у Вас будет параллельный доступ ко всем строкам. Строки всё равно будут считываться последовательно. Ещё было бы понятно, если Вы применяли бы параллельную обработку к массиву находящемуся в памяти, но ни как не в Вашем случае. Оптимизированный однопоточный метод обеспечит Вам 100% нагрузку на диск. А выше этого оптимизировать смысла не имеет.
Только не давно здесь была тема, где это подробно исследовалось.
Посмотрите эту тему Обработать файл большого размера
1
V_Monomax
10.10.2018, 18:40
  #14

Не по теме:

Цитата Сообщение от OwenGlendower Посмотреть сообщение
Мы все еще говорим про static и многопоточность или просто про static?
вообще было сказано что статик не самое лучшее, но ваше хейтерство и офтоп, не дает результатов.

0
20 / 37 / 9
Регистрация: 09.06.2015
Сообщений: 176
10.10.2018, 18:44  [ТС] 15
Цитата Сообщение от Элд Хасп Посмотреть сообщение
извиняюсь за вмешательство в такую оживлённую дискуссию. Но такой интерес - а для чего Вам многопоточность в этом решении?
файлы для обработки многострочные., думал за счёт многопотока сократить время обработки.
Но как вы советуете, попробую произвести обработку на однопотоке
0
Администратор
Эксперт .NET
16989 / 13348 / 5209
Регистрация: 17.03.2014
Сообщений: 27,294
Записей в блоге: 1
10.10.2018, 19:06 16
V_Monomax, вы можете привести аргументы (или ссылки на них) обосновывающие ваши тезисы или нет?
0
Модератор
Эксперт .NET
15456 / 10703 / 2784
Регистрация: 21.04.2018
Сообщений: 31,516
Записей в блоге: 2
10.10.2018, 19:25 17
Цитата Сообщение от Patlat Посмотреть сообщение
файлы для обработки многострочные., думал за счёт многопотока сократить время обработки.
Но как вы советуете, попробую произвести обработку на однопотоке
При оптимизации учтите, что основное замедление даёт создание объектов и потом отправка их в мусор. В т.ч. для большой скорости надо не использовать тип string, так как переменные этого типа НЕИЗМЕНЯЕМЫ. Любое изменение string это создание новой строки и отправка старой в мусор.

Добавлено через 9 минут
Так же имеет значение для чего Вы создаёте выходной список List?
Как я понял из Вашего метода Вы собираете в него уникальные ob.ToString() + "," + Convert.ToBase64String(buffer). А дальше для чего они Вам нужны?
Так как в большинстве случаев (а те которые мне приходят в голову - все) Вам потом всё равно понадобится последовательный доступ к этой коллекции. А таком случае создание не List, а IEnumerable даст Вам практически мгновенное исполнение.
0
Эксперт .NET
12090 / 8369 / 1280
Регистрация: 21.01.2016
Сообщений: 31,547
10.10.2018, 19:29 18
Цитата Сообщение от V_Monomax Посмотреть сообщение
но ваше хейтерство и офтоп, не дает результатов.
Э, не. Никакого хейтерства. Вы выдали весь спорное утверждение и было бы очень здорово увидеть пруфы. Или фразу "глупость сказал, забейте".
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
10.10.2018, 19:33 19

Не по теме:

Цитата Сообщение от Wolfdp Посмотреть сообщение
ужс...
все знают что надо писать cjnt++;


Присоединяюсь к товарищу модератору и Usaga, беглое гугление криминала в статике не выявило
0
10.10.2018, 19:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.10.2018, 19:33
Помогаю со студенческими работами здесь

Многопоточность
Доброго времени суток всем. Народ задача стоит многопоточное умножение матриц. Ну если я правильно...

Многопоточность
Всем привет. Как реализовать многопоточность с выбором количества потоков? Буду очень благодарен.

Многопоточность
вообщем вот что имею public int index = -1; public int count = 10; private...

Многопоточность
Имеется класс class MainMeneger: Form, в нем объявляются интерфейсы public IMainForm view;...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru