Инфраструктура PLINQ, класс
Как инфраструктура PLINQ, так и класс
#aggregateexception #параллельноепрограммирование #сишарп #taskfactory #parallelprogramming #csharp #csharpdotnet #csharpprogramming
Parallel
и объекты Task
автоматически маршализируют исключения потребителю, то есть исключения автоматически перехватываются и повторно генерируются для вызывающего потока. Но, к сожалению, дело не сводится просто к перехвату DivideByZeroException
. Поскольку параллельные библиотеки задействуют множество потоков, вполне возможна одновременная генерация двух и более исключений. Чтобы обеспечить получение сведений обо всех исключениях, по указанной причине исключения помещаются в контейнер AggregateException
, свойство InnerExceptions
которого содержит каждое из перехваченных исключений. Как инфраструктура PLINQ, так и класс
Parallel
при обнаружении первого исключения заканчивают выполнение запроса или цикла, не обрабатывая любые последующие элементы либо итерации тела цикла. Однако до завершения текущей итерации цикла могут быть сгенерированы дополнительные исключения. Первое возникшее исключение в AggregateException
доступно через свойство InnerException
.#aggregateexception #параллельноепрограммирование #сишарп #taskfactory #parallelprogramming #csharp #csharpdotnet #csharpprogramming
Media is too big
VIEW IN TELEGRAM
Работа с
#aggregateexception #flatteningexceptions #handlingexceptions #csharp #dotnet #multithreading #parallelprogramming #asynchronous #async #await #concurrency #threading #taskparallellibrary #tpl #asyncprogramming #unittesting #exceptionhandling #errorhandling #codingtips #programmingtips #developerlife #softwaredevelopment #codinglife #coders #programmers #codingmemes #devhumor #techhumor #csharp #dotnet
AggregateException
. Методы Flatten
и Handle
.#aggregateexception #flatteningexceptions #handlingexceptions #csharp #dotnet #multithreading #parallelprogramming #asynchronous #async #await #concurrency #threading #taskparallellibrary #tpl #asyncprogramming #unittesting #exceptionhandling #errorhandling #codingtips #programmingtips #developerlife #softwaredevelopment #codinglife #coders #programmers #codingmemes #devhumor #techhumor #csharp #dotnet
This media is not supported in your browser
VIEW IN TELEGRAM
Параллельные коллекции.
#dotNET #ConcurrentCollections #Multithreading #SystemCollections #ConcurrentStack #ConcurrentQueue #ConcurrentBag #ConcurrentDictionary #ParallelProgramming #ThreadSafety #PerformanceMatters #ProgrammingTips #Synchronization #DataStructures #LinkedLists #CodeOptimization #TechInsights #SoftwareDevelopment #ProgrammingKnowledge #MemoryEfficiency #ModernCoding
#dotNET #ConcurrentCollections #Multithreading #SystemCollections #ConcurrentStack #ConcurrentQueue #ConcurrentBag #ConcurrentDictionary #ParallelProgramming #ThreadSafety #PerformanceMatters #ProgrammingTips #Synchronization #DataStructures #LinkedLists #CodeOptimization #TechInsights #SoftwareDevelopment #ProgrammingKnowledge #MemoryEfficiency #ModernCoding
🔥
✅ Работает как связанный список связанных списков.
✅ Метод
✅ Параллельные пакеты идеальны, когда количество вызовов
🔍 Внутренняя кухня:
- Каждый поток имеет свой закрытый список.
- Извлечение происходит либо с "головы" своего списка, либо достигается "воровством" с "хвоста" другого.
📌 Важные моменты реализации:
- если поток добавляет элемент в свой закрытый список с числом элементов меньше двух, то накладывается блокировка на список, так как другой поток в это время может забирать данные текущего потока (stealing thread);
- если поток забирает элемент закрытого списка другого потока, то он забирает его не с "головы", а с "хвоста", то есть если в списке более двух элементов, то поток может заимствовать элемент без блокировки данного списка (в таком случае невозможно "состояние гонки", так как между добавляемым и забираемым элементом есть как минимум один промежуточный).
#ConcurrentBag #Multithreading #ParallelProgramming #ConcurrentCollections #LockFree #ThreadSafety #ProgrammingTips #DataStructures #Concurrency #ParallelQueue #ParallelStack #AddMethod #TakeMethod #ThreadStealing #RaceCondition #LinkedLists
ConcurrentBag
в действии!✅ Работает как связанный список связанных списков.
✅ Метод
Add
пакета не допускает почти никаких состязаний, когда вызывается многими потоками одновременно.✅ Параллельные пакеты идеальны, когда количество вызовов
Add
и Таке
сбалансировано в рамках потока.🔍 Внутренняя кухня:
- Каждый поток имеет свой закрытый список.
- Извлечение происходит либо с "головы" своего списка, либо достигается "воровством" с "хвоста" другого.
📌 Важные моменты реализации:
- если поток добавляет элемент в свой закрытый список с числом элементов меньше двух, то накладывается блокировка на список, так как другой поток в это время может забирать данные текущего потока (stealing thread);
- если поток забирает элемент закрытого списка другого потока, то он забирает его не с "головы", а с "хвоста", то есть если в списке более двух элементов, то поток может заимствовать элемент без блокировки данного списка (в таком случае невозможно "состояние гонки", так как между добавляемым и забираемым элементом есть как минимум один промежуточный).
#ConcurrentBag #Multithreading #ParallelProgramming #ConcurrentCollections #LockFree #ThreadSafety #ProgrammingTips #DataStructures #Concurrency #ParallelQueue #ParallelStack #AddMethod #TakeMethod #ThreadStealing #RaceCondition #LinkedLists
Media is too big
VIEW IN TELEGRAM
Параллельные коллекции. ConcurrentBag<T>.
Демонстрационный код программы: http://share.linqpad.net/36xbvm.linq
#ConcurrentBag #Multithreading #ParallelProgramming #ConcurrentCollections #LockFree #ThreadSafety #ProgrammingTips #DataStructures #Concurrency #ParallelQueue #ParallelStack #AddMethod #TakeMethod #ThreadStealing #RaceCondition #LinkedLists
Демонстрационный код программы: http://share.linqpad.net/36xbvm.linq
#ConcurrentBag #Multithreading #ParallelProgramming #ConcurrentCollections #LockFree #ThreadSafety #ProgrammingTips #DataStructures #Concurrency #ParallelQueue #ParallelStack #AddMethod #TakeMethod #ThreadStealing #RaceCondition #LinkedLists
Очередь производителей/потребителей – структура, полезная как при параллельном программировании, так и в общих сценариях параллелизма. Ниже описаны основные аспекты ее работы.
• Очередь настраивается для описания элементов работы или данных, над которыми выполняется работа.
• Когда задача должна выполниться, она ставится в очередь, а вызывающий код занимается другой работой.
• Один или большее число рабочих потоков функционируют в фоновом режиме, извлекая и запуская элементы из очереди.
Очередь производителей/потребителей обеспечивает точный контроль над тем, сколько рабочих потоков выполняется за раз, что полезно для ограничения эксплуатации не только ЦП, но также и других ресурсов. Скажем, если задачи выполняют интенсивные операции дискового ввода-вывода, то можно ограничить параллелизм, не истощая операционную систему и другие приложения. На протяжении времени жизни очереди можно также динамически добавлять и удалять рабочие потоки. Пул потоков CLR сам представляет собой разновидность очереди производителей/потребителей, которая оптимизирована для кратко выполняющихся заданий с интенсивными вычислениями.
Очередь производителей/потребителей обычно хранит элементы данных, на которых выполняется (одна и та же) задача. Например, элементами данных могут быть имена файлов, а задача может осуществлять шифрование содержимого таких файлов. С другой стороны, применяя делегаты в качестве элементов, можно построить более универсальную очередь производителей/потребителей, где каждый элемент способен делать все что угодно.
Реализовать очередь производителей/потребителей можно, используя событие
#ParallelProgramming #ConcurrencyControl #ProducerConsumerQueue #ThreadManagement #CodingLife
• Очередь настраивается для описания элементов работы или данных, над которыми выполняется работа.
• Когда задача должна выполниться, она ставится в очередь, а вызывающий код занимается другой работой.
• Один или большее число рабочих потоков функционируют в фоновом режиме, извлекая и запуская элементы из очереди.
Очередь производителей/потребителей обеспечивает точный контроль над тем, сколько рабочих потоков выполняется за раз, что полезно для ограничения эксплуатации не только ЦП, но также и других ресурсов. Скажем, если задачи выполняют интенсивные операции дискового ввода-вывода, то можно ограничить параллелизм, не истощая операционную систему и другие приложения. На протяжении времени жизни очереди можно также динамически добавлять и удалять рабочие потоки. Пул потоков CLR сам представляет собой разновидность очереди производителей/потребителей, которая оптимизирована для кратко выполняющихся заданий с интенсивными вычислениями.
Очередь производителей/потребителей обычно хранит элементы данных, на которых выполняется (одна и та же) задача. Например, элементами данных могут быть имена файлов, а задача может осуществлять шифрование содержимого таких файлов. С другой стороны, применяя делегаты в качестве элементов, можно построить более универсальную очередь производителей/потребителей, где каждый элемент способен делать все что угодно.
Реализовать очередь производителей/потребителей можно, используя событие
AutoResetEvent
(а также впоследствии методы Wait
и Pulse
класса Monitor
). Тем не менее, написание очереди производителей/потребителей с нуля стало необязательным, т.к. большая часть функциональности предлагается классом BlockingCollection<T>
. На слайде продемонстрировано, как его задействовать.#ParallelProgramming #ConcurrencyControl #ProducerConsumerQueue #ThreadManagement #CodingLife
Media is too big
VIEW IN TELEGRAM
Параллельные коллекции. Реализация очереди производителей/потребителей.
#ParallelProgramming #ConcurrencyControl #ProducerConsumerQueue #ThreadManagement #CodingLife #SoftwareDevelopment #CodeOptimization #Multithreading #AsyncProgramming #TechCommunity #ComputerScience #DeveloperTools #CodingTips #ProgrammerLife #SystemDesign #ResourceManagement #TechInnovat
#ParallelProgramming #ConcurrencyControl #ProducerConsumerQueue #ThreadManagement #CodingLife #SoftwareDevelopment #CodeOptimization #Multithreading #AsyncProgramming #TechCommunity #ComputerScience #DeveloperTools #CodingTips #ProgrammerLife #SystemDesign #ResourceManagement #TechInnovat
Media is too big
VIEW IN TELEGRAM
МНОГОПОТОЧНАЯ ОБРАБОТКА
- Для чего нужен параллелизм?
- Безопасность к потокам в серверах приложений
#Многопоточность #Параллелизм #ThreadSafety #ServerProgramming #ConcurrentComputing #MultiThreading #ParallelProgramming #Coding #SoftwareEngineering #DeveloperLife #TechCommunity #CodeNewbie #BackendDevelopment #SystemArchitecture #PerformanceOptimization #Scalability #TechTalk #ProgrammingTips #SoftwareDevelopment #DevCommunity #TechInnovation #CodingForFuture #ProgrammerLife #TechWorld #ModernCoding #Efficiency #ServerSide
- Для чего нужен параллелизм?
- Безопасность к потокам в серверах приложений
#Многопоточность #Параллелизм #ThreadSafety #ServerProgramming #ConcurrentComputing #MultiThreading #ParallelProgramming #Coding #SoftwareEngineering #DeveloperLife #TechCommunity #CodeNewbie #BackendDevelopment #SystemArchitecture #PerformanceOptimization #Scalability #TechTalk #ProgrammingTips #SoftwareDevelopment #DevCommunity #TechInnovation #CodingForFuture #ProgrammerLife #TechWorld #ModernCoding #Efficiency #ServerSide
Трансляции по параллельному программированию
Темы: Parallel LINQ, параллелизм задач, параллельные коллекции.
https://csharpcooking.github.io/posts/Broadcasts-Parallel-Programming/
#сишарп #параллельноепрограммирование #csharp #parallelprogramming
Темы: Parallel LINQ, параллелизм задач, параллельные коллекции.
https://csharpcooking.github.io/posts/Broadcasts-Parallel-Programming/
#сишарп #параллельноепрограммирование #csharp #parallelprogramming
C# Cooking
Трансляции по параллельному программированию
Темы: Parallel LINQ, параллелизм задач, параллельные коллекции.