Чем синхронный сервер отличается от асинхронного?
Вопрос может быть сформулирован как «сравните Jetty и Netty», или «зачем нужен Spring WebFlux».
Большинство современных Java web-серверов синхронные. Это значит, что для каждого пришедшего HTTP-запроса выделяется отдельный поток. Даже если такой поток переиспользуется с помощью пула, он остается занятым до конца обработка запроса.
Таким образом, если каждый запрос выполняется одну секунду, то при всего лишь 2000 запросов в секунду сервер расходует 2000 потоков. Потоки в ОС – ограниченный ресурс, и не важно как сконфигурирован ваш сервер – в какой-то момент производительность резко просядет.
Альтернативное решение – асинхронные сервера. В них для потоков обработки HTTP-запросов используется work stealing. В широком смысле, вызовы асинхронных функций не блокируют выполнение, а их результат вместо return value возвращается параметром коллбэка. В Java этот результат зачастую возвращается в виде объекта Future.
Чтобы вся обработка запроса стала действительно асинхронной, необходимо также избавиться от блокирующих операций. Иначе преимущество подхода с work stealing выродится в простой пул потоков. Блокирующая работа с файлами и сетью должна быть заменена на NIO, а для БД должен быть использован асинхронный драйвер.
#Java
Вопрос может быть сформулирован как «сравните Jetty и Netty», или «зачем нужен Spring WebFlux».
Большинство современных Java web-серверов синхронные. Это значит, что для каждого пришедшего HTTP-запроса выделяется отдельный поток. Даже если такой поток переиспользуется с помощью пула, он остается занятым до конца обработка запроса.
Таким образом, если каждый запрос выполняется одну секунду, то при всего лишь 2000 запросов в секунду сервер расходует 2000 потоков. Потоки в ОС – ограниченный ресурс, и не важно как сконфигурирован ваш сервер – в какой-то момент производительность резко просядет.
Альтернативное решение – асинхронные сервера. В них для потоков обработки HTTP-запросов используется work stealing. В широком смысле, вызовы асинхронных функций не блокируют выполнение, а их результат вместо return value возвращается параметром коллбэка. В Java этот результат зачастую возвращается в виде объекта Future.
Чтобы вся обработка запроса стала действительно асинхронной, необходимо также избавиться от блокирующих операций. Иначе преимущество подхода с work stealing выродится в простой пул потоков. Блокирующая работа с файлами и сетью должна быть заменена на NIO, а для БД должен быть использован асинхронный драйвер.
#Java
Под капотом Python. Тонкости популярных конструкций with и contextmanager
В этой статье оглянемся в прошлое языка, ответим на вопросы, как написать менеджер контекста, как создать функцию генератор для декоратора contextmanager. Опытные разработчики могут узнать что-то новенькое или дополнить статью ценными комментариями.
https://habr.com/ru/companies/beeline_cloud/articles/749580/
#Python
В этой статье оглянемся в прошлое языка, ответим на вопросы, как написать менеджер контекста, как создать функцию генератор для декоратора contextmanager. Опытные разработчики могут узнать что-то новенькое или дополнить статью ценными комментариями.
https://habr.com/ru/companies/beeline_cloud/articles/749580/
#Python
Примеры исходного кода C++
Эта страница содержит примеры исходного кода функций стандартной библиотеки программирования C++.
https://www.sourcecodeexamples.net/p/cpp-source-code-examples.html
#cpp
Эта страница содержит примеры исходного кода функций стандартной библиотеки программирования C++.
https://www.sourcecodeexamples.net/p/cpp-source-code-examples.html
#cpp
MS-DOS v1.25, v2.0, v4.0 Source Code
Оригинальные исходники MS-DOS 1.25, 2.0 и 4.0 для справочных целей
Это репо содержит оригинальные исходные коды и скомпилированные двоичные файлы для MS-DOS v1.25 и MS-DOS v2.0, а также исходные коды для MS-DOS v4.00, совместно разработанной IBM и Microsoft.
Файлы MS-DOS v1.25 и v2.0 были первоначально выложены в общий доступ в Музее компьютерной истории 25 марта 2014 года и (пере)публикуются в этом репо, чтобы облегчить их поиск, ссылки на них в других работах, а также чтобы дать возможность исследовать и экспериментировать тем, кто интересуется ранними операционными системами для ПК.
https://github.com/microsoft/MS-DOS/
Оригинальные исходники MS-DOS 1.25, 2.0 и 4.0 для справочных целей
Это репо содержит оригинальные исходные коды и скомпилированные двоичные файлы для MS-DOS v1.25 и MS-DOS v2.0, а также исходные коды для MS-DOS v4.00, совместно разработанной IBM и Microsoft.
Файлы MS-DOS v1.25 и v2.0 были первоначально выложены в общий доступ в Музее компьютерной истории 25 марта 2014 года и (пере)публикуются в этом репо, чтобы облегчить их поиск, ссылки на них в других работах, а также чтобы дать возможность исследовать и экспериментировать тем, кто интересуется ранними операционными системами для ПК.
https://github.com/microsoft/MS-DOS/
Konf
Простейший загрузчик конфигураций для Go, который читает/смотрит из файла, env, флага и облаков (AWS, Azure, GCP).
Основные возможности:
konf.Unmarshal для чтения конфигурации в любой тип объекта.
konf.OnChange для регистрации колбэков при изменении конфигурации.
konf.Explain для понимания, откуда загружается конфигурация.
Различные провайдеры для загрузки конфигурации из облаков (AWS, Azure и GCP).
Zero dependencies в core модуле, который поддерживает загрузку конфигурации из переменных окружения, флагов и встроенной файловой системы.
https://github.com/nil-go/konf
#golang
Простейший загрузчик конфигураций для Go, который читает/смотрит из файла, env, флага и облаков (AWS, Azure, GCP).
Основные возможности:
konf.Unmarshal для чтения конфигурации в любой тип объекта.
konf.OnChange для регистрации колбэков при изменении конфигурации.
konf.Explain для понимания, откуда загружается конфигурация.
Различные провайдеры для загрузки конфигурации из облаков (AWS, Azure и GCP).
Zero dependencies в core модуле, который поддерживает загрузку конфигурации из переменных окружения, флагов и встроенной файловой системы.
https://github.com/nil-go/konf
#golang
Совет по Java 💡
С помощью библиотеки Jinq (https://jinq.org) вы можете писать запросы к базам данных, используя потоки Java. Она обеспечивает стиль запросов, схожий с известной библиотекой .NET LINQ. Конечно, вы можете легко интегрировать Jinq с Spring Boot.
#java #jpa #streams
С помощью библиотеки Jinq (https://jinq.org) вы можете писать запросы к базам данных, используя потоки Java. Она обеспечивает стиль запросов, схожий с известной библиотекой .NET LINQ. Конечно, вы можете легко интегрировать Jinq с Spring Boot.
#java #jpa #streams
Go-like каналы на C++
Каналы (channels, pipes) – это удобная абстракция для построения приложений, работающих в многопоточной среде. Они используются для передачи сообщений между потоками и, одновременно с этим, как средство синхронизации потоков. Я буду ссылаться на "Go-style channels", т.к. на мой взгляд, важная особенность каналов в языке GO – это возможность их мультиплексировать.
Реализации каналов на языке C++, конечно же, есть, например, в библиотеке boost::fibers, можно найти реализацию двух видов каналов. В документации boost::fibers можно найти описания способов мультиплексирования, правда не самих каналов, но и к ним можно применить подобную технику.
https://habr.com/ru/articles/805561/
#cpp
Каналы (channels, pipes) – это удобная абстракция для построения приложений, работающих в многопоточной среде. Они используются для передачи сообщений между потоками и, одновременно с этим, как средство синхронизации потоков. Я буду ссылаться на "Go-style channels", т.к. на мой взгляд, важная особенность каналов в языке GO – это возможность их мультиплексировать.
Реализации каналов на языке C++, конечно же, есть, например, в библиотеке boost::fibers, можно найти реализацию двух видов каналов. В документации boost::fibers можно найти описания способов мультиплексирования, правда не самих каналов, но и к ним можно применить подобную технику.
https://habr.com/ru/articles/805561/
#cpp
Benedict
Если вы столкнулись с трудностями при работе со словарями в Python, то benedict может стать тем решением, которое вы искали.
benedict наследуется от встроенного типа dict, что означает, что он полностью совместим с существующими словарями и может быть использован в качестве замены в большинстве случаев.
Одной из ключевых особенностей benedict является поддержка keylists и keypaths. Это упрощает доступ к значениям в сложных словарях и работу с ними без необходимости вручную копаться во вложенных уровнях.
#Python
Если вы столкнулись с трудностями при работе со словарями в Python, то benedict может стать тем решением, которое вы искали.
benedict наследуется от встроенного типа dict, что означает, что он полностью совместим с существующими словарями и может быть использован в качестве замены в большинстве случаев.
Одной из ключевых особенностей benedict является поддержка keylists и keypaths. Это упрощает доступ к значениям в сложных словарях и работу с ними без необходимости вручную копаться во вложенных уровнях.
#Python
This media is not supported in your browser
VIEW IN TELEGRAM
Cassowary
Запускайте приложения Windows в Linux как родные, используйте приложения linux для запуска файлов, расположенных в windows vm, без необходимости установки приложений на vm. С простым в использовании графическим интерфейсом конфигурации
Cassowary поддерживает:
Запуск приложений Windows, как если бы они были родными приложениями
Открытие файлов с хоста Linux непосредственно в приложениях Windows
Использование приложений Linux для открытия файлов, находящихся на виртуальной машине Windows.
Обеспечение легкого доступа между гостевой и хостовой файловыми системами
Простая в использовании утилита настройки
Создание программы запуска приложений для Windows-приложений
Автоматическое приостановление работы ВМ, когда не используется приложение Windows, и автоматическое возобновление ее работы при необходимости (только для virt-manager)
https://github.com/casualsnek/cassowary
Запускайте приложения Windows в Linux как родные, используйте приложения linux для запуска файлов, расположенных в windows vm, без необходимости установки приложений на vm. С простым в использовании графическим интерфейсом конфигурации
Cassowary поддерживает:
Запуск приложений Windows, как если бы они были родными приложениями
Открытие файлов с хоста Linux непосредственно в приложениях Windows
Использование приложений Linux для открытия файлов, находящихся на виртуальной машине Windows.
Обеспечение легкого доступа между гостевой и хостовой файловыми системами
Простая в использовании утилита настройки
Создание программы запуска приложений для Windows-приложений
Автоматическое приостановление работы ВМ, когда не используется приложение Windows, и автоматическое возобновление ее работы при необходимости (только для virt-manager)
https://github.com/casualsnek/cassowary
This media is not supported in your browser
VIEW IN TELEGRAM
❌ Избегайте бесконечного вложения провайдеров в React.
✅ Вместо этого объедините все ваши провайдеры с помощью композиции.
✅ Вместо этого объедините все ваши провайдеры с помощью композиции.
Путешествие в мир эмуляторов микропроцессоров
Тема разработки эмуляторов олдскульных микропроцессоров типа того же Intel 8080 не нова. Если вы уже разбираетесь в вопросе, то для вас этот пост не будет чем-то новым, разве что вы увидите еще один подход к реализации такого проекта. Для тех, кто ничего об этом не слышал – прошу под кат.
https://habr.com/ru/articles/850930/
Тема разработки эмуляторов олдскульных микропроцессоров типа того же Intel 8080 не нова. Если вы уже разбираетесь в вопросе, то для вас этот пост не будет чем-то новым, разве что вы увидите еще один подход к реализации такого проекта. Для тех, кто ничего об этом не слышал – прошу под кат.
https://habr.com/ru/articles/850930/
This media is not supported in your browser
VIEW IN TELEGRAM
Становится ли дочерний компонент клиентского компонента также клиентским компонентом?
Пример уменьшения размерности данных с помощью линейных и нелинейных методов в Python
Уменьшение размерности данных — это подход упрощения сложных наборов данных для облегчения их обработки. По мере того как данные растут и становятся более сложными, извлекать информацию становится все труднее, а визуализация становится более накладной. Методы уменьшения размерности данных решают эту проблему, предоставляя меньшее количество измерений (столбцов) при сохранении наиболее важной информации. Мы можем потерять некоторые детали, но получить более простое представление данных, которое легче обрабатывать и сравнивать.
https://habr.com/ru/articles/751050/
#python
Уменьшение размерности данных — это подход упрощения сложных наборов данных для облегчения их обработки. По мере того как данные растут и становятся более сложными, извлекать информацию становится все труднее, а визуализация становится более накладной. Методы уменьшения размерности данных решают эту проблему, предоставляя меньшее количество измерений (столбцов) при сохранении наиболее важной информации. Мы можем потерять некоторые детали, но получить более простое представление данных, которое легче обрабатывать и сравнивать.
https://habr.com/ru/articles/751050/
#python