Как стать автором
Обновить

Ruby знакомство с Thread

Время на прочтение 3 мин
Количество просмотров 775
Чулан

Лирическое отступление


Например, мы пишем сервер. Воплощение сервера это зацикливание, постоянный опрос чего-либо. Все мелкодискретное принято считать постоянным, вот и получается постоянное соединение.

Реалии


В руби есть бесконечный цикл loop.
Copy Source | Copy HTML
  1. loop{
  2.   puts "Ничто меня не остановит."
  3. }
  4. #Собственно отсюда и начинаются проблемы.
  5. puts "дело в том, что этот код никогда не выполнится."

Т.е. надо все выполнить до того как мы начали зацикливание.
Кроме того данная операция весьма чувствительна для процессора. Если нам не нужно очень частого повторения, то цикл можно на время и усыплять.
Copy Source | Copy HTML
  1. loop{
  2.   puts "Ничто меня не остановит."
  3.   sleep(1) #одна секунда сна
  4. }

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

Thread


Для решения этих проблем существую потоки.
Читать дальше →
Всего голосов 15: ↑9 и ↓6 +3
Комментарии 26

Ruby — async_fu, простота использования тредов

Время на прочтение 2 мин
Количество просмотров 930
Ruby *
Я не очень давно работаю с ruby но почти в первые дни появилась острая нужда запускать долго играющие функции, которые не должны блокировать работу основной программы.

Готового и простого решения я не нашел, посему начал изобретать велосипед.

На данный момент библиотека позволяет:
  • организовывать асинхронные вызовы методов вашего класса
  • гарантирует выполнение всех потоков перед выходом из программы

Читать дальше →
Всего голосов 8: ↑5 и ↓3 +2
Комментарии 15

«Танцы с бубном» вокруг Thread

Время на прочтение 3 мин
Количество просмотров 7.3K
Java *

При разработке cloud платформы веб-приложений был реализован сервис серверной логики на базе java scripting технологии для более гибкого управления другими сервисами платформы.

Соответственно «стал ребром» вопрос контроля над порождением, жизнью и использованием ресурсов платформы дочерними потоками создаваемыми из скриптинга. Потоки через скриптинг могут создаваться всеми доступными способами. В GoogleAppEngine проблему дочерних потоков решили простым запретом их порождения. В нашем случае хочется иметь более гибкое решение. Поэтому необходимо иметь контроль над дочерными потоками создаваемыми из главного потока запроса.

Изначально предполагалось что задача тривиальна и что в Java есть стандартные для этого средства. Но ожидания не оправдались.
Читать дальше →
Всего голосов 26: ↑23 и ↓3 +20
Комментарии 40

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

Время на прочтение 9 мин
Количество просмотров 36K
Ruby *
Перевод
Перевод главы «Multithreading» книги David Thomas и Andrew Hunt «Programming Ruby: The Pragmatic Programmers' Guide, Second Edition».

Часто самым простым способом выполнить одновременно две вещи является использование потоков в Ruby. Они являются внутрипроцессными, встроенными в интерпретатор Ruby. Это делает потоки Ruby полностью переносимыми, т.е. независимыми от операционной системы. Но в то же время вы точно не получите выгоду от использования родных, нативных потоков. Что это значит?

Вы можете столкнуться с голоданием (thread starvation — это когда поток с маленьким приоритетом не имеет шанса запуститься). Если вы хотите заблокировать ваши потоки, то со скрежетом остановится целый процесс. А если возникнет ситуация, что некоторые потоки будут посылать вызовы операционной системе, для выполнения которых требуется немалое время, то все потоки будут висеть, пока интерпретатор не получит контроль обратно. И наконец, если ваша машина имеет больше одного процессора, потоки Ruby не будут это использовать, т.к. они запускаются в одном процессе, а в одиночном родном потоке они будут вынуждены запускаться на одном процессоре единовременно.

Все это звучит страшновато. Тем не менее, на практике во многих случаях выгода от использования потоков во многом перевешивает любые потенциальные проблемы, которые могут возникнуть. Потоки Ruby являются эффективным и легким путем достижения параллельности в вашем коде. Вы просто должны понять основные проблемы реализации, и, соответственно, архитектуру.
Читать дальше →
Всего голосов 41: ↑37 и ↓4 +33
Комментарии 30

Создание запрещенного информационного потока. 257 тредов

Время на прочтение 3 мин
Количество просмотров 839
Программирование *
Это первая статья из серии статей о создании запрещённых информационных потоков (ИП). Идеи организации этих ИП придуманы не здесь и не мной. Мне довелось лишь реализовывать в учебных целях утилиты, демонстрирующие эти уязвимости.

В этой статье я расскажу об организации информационного потока, основанного на изменении одним из приложений своего состояния опросе другим приложением состояния первого. При данной модели взаимодействия у одного передатчика может присутствовать несколько слушателей. В последующих статьях будут отличаться как среды взаимодействия программ, так и алгоритмы обмена информацией.
Читать дальше →
Всего голосов 11: ↑6 и ↓5 +1
Комментарии 16

Делаем простейший сборщик ошибок для Android

Время на прочтение 3 мин
Количество просмотров 25K
Разработка под Android *
При разработке приложения неизбежно приходится сталкиваться с ошибками в коде и/или окружении. И очень печально когда подобные ошибки встречаются не на тестовом телефоне/эмуляторе а у живых пользователей. Еще печальнее если это не ваш друг бета-тестер и толком никто не может объяснить что и где свалилось.

Обычно при внезапном падении приложения Android предлагает отправить отчет об ошибке, где будет и подробный стэк-трейс и информация о версии вашего приложения. К сожалению пользователи не всегда нажимают кнопку «отправить отчет» а для дебаг-приложений или приложений не из маркета такая функциональность и вовсе недоступна.

Что же делать? На помощь приедет возможность языка Java обрабатывать исключения (Exceptions), в том числе и непойманные (unhandled).

Читать дальше →
Всего голосов 59: ↑52.5 и ↓6.5 +46
Комментарии 13

Java. Остановись задача

Время на прочтение 2 мин
Количество просмотров 92K
Java *
Из песочницы
Вот уже почти год как усиленно занимаюсь коддингом на Java. Столкнулся с довольно серьезной на мой взгляд проблемой, связанных с многопоточностью, как мне кажется, неразрешимой в рамках текущей реализации JVM от Oracle (сказанное относится к JDK 1.5 и выше). Дело в том, что на данный момент в Java нет возможности гарантированно безопасно остановить выполнение какого-либо потока. Данный пост разъясняет почему это именно так и предлагает начать дискуссию о способах решения этой проблемы.
Читать дальше →
Всего голосов 58: ↑41 и ↓17 +24
Комментарии 29

Android UI thread

Время на прочтение 4 мин
Количество просмотров 67K
Разработка под Android *
Большая часть кода Android приложения работает в контексте компонент, таких как Activity, Service, ContentProvider или BroadcastReceiver. Рассмотрим, как в системе Android организованно взаимодействие этих компонент с потоками.
Читать дальше →
Всего голосов 36: ↑30 и ↓6 +24
Комментарии 16

Боремся с deadlock-ами: паттерн unlocked callbacks

Время на прочтение 6 мин
Количество просмотров 13K
Блог компании Нордавинд Проектирование и рефакторинг *

Ситуации взаимной блокировки


В Википедии дается следующее определение взаимной блокировки: «Взаимная блокировка (англ. deadlock) — ситуация в многозадачной среде или СУБД, при которой несколько процессов находятся в состоянии бесконечного ожидания ресурсов, занятых самими этими процессами».

Взаимные блокировки носят, как правило, динамический характер: их проявление зависит от таких факторов, как действия пользователя, доступность сетевых сервисов, позиционирование головки жесткого диска, переключение задач в системе с вытесняющей многозадачностью и т.п.

Классический пример взаимной блокировки: первый поток (A) захватывает мьютекс M1 и следом мьютекс M2. Второй поток (B) захватывает мьютекс M2, а уже после этого – мьютекс M1. Взаимная блокировка этих двух потоков может произойти следующим образом: поток A захватывает M1, поток B захватывает M2, после этого оба потока «обречены»: ни поток A не может захватить M2, ни поток B не может захватить M1; попытки захвата мьютексов заблокируют оба потока.

Описанная взаимная блокировка произойдет только в том случае, если оба потока успеют захватить ровно по одному мьютексу. В противном случае потоки продолжат свое выполнение.

Данная ситуация очень распространена в сложных многопоточных системах. Как правило, мьютексы-участники расположены далеко друг от друга (в различных компонентах системы), и выявить участников взаимной блокировки оказывается достаточно сложно.
Читать дальше →
Всего голосов 11: ↑5 и ↓6 -1
Комментарии 15

Создание простой программы с RMI и параллельным доступом на графический интерфейс в Java

Время на прочтение 5 мин
Количество просмотров 21K
Программирование *Java *
Из песочницы
Когда мне пришлось сильно углубиться в использование RMI, я поняла, какое большое значение играет умение правильно реализовать параллельность в самом графическом интерфейсе программы. На мое удивление в интернете не было достаточно материала на эту тему и особенно качественных примеров, хотя тема для любого программиста несоменно очень важная. Именно поэтому я решила поделиться своим опытом.

Кратко о RMI: программный интерфейс вызова удаленных методов в языке Java (источник). С помощью него можно например управлять данными на программе сервера с одного или множества компьютеров. Подробнее можно почитать на Хабре. Будем исходить из того, что с его основами вы уже знакомы. Необходимо так же иметь представление о нововведениях в Java 8, а именно — вам понадобятся лямбда-выражения. Хорошее объяснение есть здесь.
Читать дальше →
Всего голосов 19: ↑15 и ↓4 +11
Комментарии 7

Сравнение библиотек для выполнения асинхронных запросов

Время на прочтение 3 мин
Количество просмотров 17K
Разработка мобильных приложений *Разработка под Android *
Из песочницы
Если вам в проекте необходимо загружать картинки и/или отправлять http-запросы, выполнять любую другую долгую операцию, которая может заблокировать UI поток, то как ни крути придется использовать решение для выполнения асинхронных запросов.

С самого начала я, по старинке, расскажу про стандартные способы AsyncTask/Loaders и объясню, почему их лучше не использовать. Затем расскажу про продвинутые методы решения этой задачи.

image
Читать дальше →
Всего голосов 14: ↑11 и ↓3 +8
Комментарии 11

GridFS vs SQL Server vs Local

Время на прочтение 5 мин
Количество просмотров 5.8K
.NET *C# *Тестирование веб-сервисов *
Из песочницы

Для дотошных


В последнее время в среде разработчиков серверных приложений часто возникают споры о том, как лучше управлять фалами и какая технология обеспечивает более быстрые чтение/запись файлов. В сети стали появляться статьи и статейки о сравнительной производительность локальной файловой системы и GridFS. Или о хранении файлов в реляционной базе как BLOB против хранения на жёстком диске в файловой системе. Вот и я решил ввязаться в этот противостояние. Сегодня мы будем сравнивать производительность и накладные расходы MongoDB 2.6.7 x64 GridFS против MS SQL Server Express 2012 v11.0.5058.0 x64 против NTFS. Для эксперимента была использована платформа Windows 7 x64 SP1 на AMD Athlon(tm) II X2 250 Processor 3.00 GHz c 4ГБ ОЗУ 1033 MHz и HDD 600 Gb SATA 6Gb/s Western Digital VelociRaptor 10000rpm 32Mb. После каждого теста компьютер перезапускался, а базы обнулялись. Производительность будем рассматривать на примере файлового сервера на C# под .NET 4.5, код которого прикреплён к статье.
Читать дальше →
Всего голосов 10: ↑7 и ↓3 +4
Комментарии 2

MyHTML — HTML парсер на «голом» Си с поддержкой POSIX Threads

Время на прочтение 3 мин
Количество просмотров 31K
Open source *HTML *
image

Всем привет!

Как можно было догадаться из заголовка речь пойдет о парсинге HTML (далее хтмл).

преамбула
Всего голосов 57: ↑55 и ↓2 +53
Комментарии 45

Синхронизация в онлайн играх

Время на прочтение 2 мин
Количество просмотров 15K
Разработка игр *
Многопользовательская онлайн игра – передача пакетов и обмен сообщеями между клиентами и сером(client-server,p2p,tcp/upd, графы)
Представьте себе многопользовательсукую игру по типу lineage
Читать дальше →
Всего голосов 57: ↑7 и ↓50 -43
Комментарии 85

Многопоточность (concurrency) в Swift 3. GCD и Dispatch Queues

Время на прочтение 28 мин
Количество просмотров 280K
Программирование *Разработка под iOS *Разработка мобильных приложений *Swift *
Надо сказать, что многопоточность (сoncurrency) в iOS всегда входит в вопросы, задаваемые на интервью разработчикам iOS приложений, а также в число топ ошибок, которые делают программисты при разработке iOS приложений. Поэтому так важно владеть этим инструментом в совершенстве.
Итак, у вас есть приложение, оно работает на main thread (главном потоке), который отвечает за выполнение кода, отображающего ваш пользовательский интерфейс (UI). Как только вы начинаете добавлять к вашему приложению такие «затратные по времени» куски кода, как загрузка данных из сети или обработка изображений на main thread (главном потоке), то работа вашего UI начинает сильно замедляться и даже может привести к полному его «замораживанию».



Как можно изменить архитектуру приложения, чтобы таких проблем не возникало? В этом случае на помощь приходит многопоточность (сoncurrency), которая позволяет одновременно выполнять две или более независимые задачи (tasks): вычисления, загрузку данных из сети или с диска, обработку изображений и т.д.
Читать дальше →
Всего голосов 24: ↑23 и ↓1 +22
Комментарии 14

Как эффективнее читать данные с диска (при условии, что у вас .Net)

Время на прочтение 7 мин
Количество просмотров 12K
Блог компании Технологический Центр Дойче Банка Тестирование IT-систем *Программирование *.NET *Разработка под Windows *


Привет, Хабр! Некоторое время назад меня заинтересовал вопрос: как эффективнее всего читать данные с диска (при условии, что у вас .Net)? Задача чтения кучи файлов встречается во множестве программ, которые при самом старте начинают вычитывать конфигурации, некоторые самостоятельно подгружают модули и т.д.

В интернете я не нашел подобных сравнений (если не считать тюнинга под определенные конфигурации).
Читать дальше →
Всего голосов 21: ↑19 и ↓2 +17
Комментарии 18

Клиент-сервер шаг — за — шагом, от однопоточного до многопоточного (Client-Server step by step)

Время на прочтение 11 мин
Количество просмотров 18K
Программирование *
Recovery mode
Цель публикации показать начинающим Java программистам все этапы создания многопоточного сервера. Для полного понимания данной темы основная информация содержится в комментариях моего кода и в выводимых в консоли сообщениях для лучшего понимания что именно происходит и в какой именно последовательности.

В начале будет рассмотрено создание элементарного клиент-сервера, для усвоения базовых знаний, на основе которых будет строиться многопоточная архитектура.
Читать дальше →
Всего голосов 17: ↑9 и ↓8 +1
Комментарии 32

Почему появились асинхронные веб-сервера?

Время на прочтение 5 мин
Количество просмотров 7.5K
Блог компании OTUS Высокая производительность *Анализ и проектирование систем **nix *Промышленное программирование *
Всем привет. На связи Владислав Родин. В настоящее время я являюсь руководителем курса «Архитектор высоких нагрузок» в OTUS, а также преподаю на курсах, посвященных архитектуре ПО.

Помимо преподавания, как вы могли заметить, я занимаюсь написанием авторского материала для блога OTUS на хабре и сегодняшнюю статью хочу приурочить к запуску курса «Администратор Linux», на который прямо сейчас открыт набор.





Введение


Почему веб-приложение тормозит и не держит нагрузку? Разработчики, которые первыми столкнулись с таким вопросом и провели исследования некоторых систем, пришли к неутешительному выводу о том, что оптимизации одной бизнес-логики будет недостаточно. Ответ на поставленный вопрос кроется на более низком уровне — на уровне операционной системы. Чтобы ваше приложение держало нагрузку, необходимо пересмотреть его архитектурную концепцию таким образом, чтобы эффективно работать именно на этом уровне. Это привело к возникновению асинхронных веб-серверов.

К сожалению, мне не удалось найти ни одного материала, позволяющего восстановить разом все причинно-следственные связи в эволюции веб-серверов. Так возникла идея написания этой статьи, которая, как я надеюсь, станет таким материалом.
Читать дальше →
Всего голосов 13: ↑10 и ↓3 +7
Комментарии 6

Мини плата для разработки и отладки ПО на BLE, Zigbee Thread

Время на прочтение 2 мин
Количество просмотров 6.4K
Беспроводные технологии *Разработка под Arduino *DIY или Сделай сам
Приветствую читателей Habr! В этой статье хочу поделиться с сообществом своей новой разработкой, речь пойдет о небольшой Development Board на чипе nRF52840. Плата была спроектированна под недорогие модули E73-2G4M08S1C. Идея ее создания родилась в одном уютном телеграмм чатике довольно спонтанно. Была необходимость в недорогом и простом в сборке девайсе.

Всего голосов 29: ↑25 и ↓4 +21
Комментарии 8

ProcInsp — веб-диспетчер задач для Windows

Время на прочтение 8 мин
Количество просмотров 7.9K
Блог компании CUSTIS .NET *IT-инфраструктура *C# *DevOps *

«Сказать программисту, что уже есть библиотека, делающая Х, это то же самое, что сказать музыканту, что уже есть песня про любовь» (с)

Есть разные способы посмотреть, чем занят сервер под Windows: можно зайти по RDP и открыть Task Manager или Process Explorer, а можно запустить удаленный сеанс через PowerShell и набрать команду Get-Process. Но что если серверов много и нужна информация по всем сразу? Заходить по RDP неудобно, а для работы с PowerShell требуется определенная квалификация.

Мы не нашли подходящего инструмента, поэтому разработали свой. Итак, встречайте ProcInsp — совершенно новый диспетчер задач для Windows.

Читать далее
Всего голосов 15: ↑15 и ↓0 +15
Комментарии 12
1