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

Онлайн митап от ВсеИнструменты.Ру о PHP, MySQL, нагрузках и асинхронности

Блог компании ВсеИнструменты.ру Высокая производительность *PHP *MySQL *

Онлайн митап, посвященный опыту внедрения микросервисов и выбору между PHP и Go для этого, про эксплуатацию MySql на постоянно растущих нагрузках, а также про асинхронный PHP, его настоящее и будущее.

Читать далее
Всего голосов 18: ↑17 и ↓1 +16
Просмотры 5.5K
Комментарии 6

Курс «Асинхронное программирование для начинающих»

Блог компании KTS Python *Учебный процесс в IT

В понедельник, 20 декабря, стартует второй поток курса «Асинхронное программирование на Python для начинающих» от школы Metaclass

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

Курс состоит из 7 модулей с видеоуроками, заданий с автопроверкой, онлайн-разборами ДЗ и менторской поддержкой.

Также для всех участников курса мы подготовили выделенные виртуалки для каждого ДЗ: писать код можно будет прямо в браузере на нашей платформе — вы можете посмотреть демо.

Сегодня, 8 декабря в 19:00, мы проведем вебинар про курс, на котором преподаватели ответят на вопросы по программе и разыграют бесплатное место на продвинутый трек курса.

→ Записаться на вебинар можно по ссылке, всех ждем!

Читать далее
Всего голосов 12: ↑9 и ↓3 +6
Просмотры 4.2K
Комментарии 2

Курс по асинхронному программированию для начинающих, 3-й поток

Блог компании KTS Python *Учебный процесс в IT

Привет!

11 апреля, через месяц, начинается 3-й поток нашего флагманского курса — «Асинхронное программирование на Python».

Что ждет вас на курсе:

— познакомитесь с теорией асинхронности
— узнаете, чем она отличается от параллельного выполнения потоков и процессов
— научитесь использовать асинхронный веб-фреймворк в Python
— начнете работать с БД через асинхронные коннекторы
— напишите чат-бота
— и даже разберетесь, как написать собственный event loop

Читать далее
Всего голосов 7: ↑7 и ↓0 +7
Просмотры 2.4K
Комментарии 0

Асинхронная модель программирования (часть 1)

Чулан
Для начала разберемся с проблемой, а именно зачем нам нужна асинхронная модель и чем не устраивает синхронная.

Синхронная модель блокирует поток в ожидании результата ввода вывода (сеть, файловая система, etc. далее I/O), следовательно для того чтобы выполнить что-либо еще необходим отдельный поток. Таким образом узким местом данной модели являются потоки и переключение контекста потоков что является очень ресурсоемкой операцией.
В идеале неободимо чтобы в системе было столько рабочих потоков, сколько процессоров(ядер) в системе.

Асинхронная модель позволяет продолжить выполнение потока при операции I/O, и получить уведомление при завершении операции. Таким образом поток может выполнять полезную работу пока осуществяется I/O.

Отлично, теперь мы имеем представление о том что это и поэтому решаем использовать асинхронную модель как наиболее эффективную, но чем больше мы разбираемся с ней тем больше подводных камней встречаем.
Читать дальше →
Всего голосов 20: ↑6 и ↓14 -8
Просмотры 1.1K
Комментарии 28

Асинхронное программирование — цепочки вызовов

.NET *F# *

Когда в коде фигурирует пара вызовов BeginXxx()/EndXxx(), это приемлимо. Но что если алгоритм требует несколько таких вызовов подряд, то количество методов (или анонимных делегатов) преумножится и код станет менее читабельным. К счастью, эта проблема решена как в F# так и в C#.



Читать дальше →
Всего голосов 48: ↑40 и ↓8 +32
Просмотры 5.2K
Комментарии 15

Теперь Google Analytics работает Асинхронно

IT-компании
Новый код выглядит вот так:
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-X']);
_gaq.push(['_trackPageview']);

(function() {
 var ga = document.createElement('script');
 ga.src = ('https:' == document.location.protocol ? 'https://ssl' :
   'http://www') + '.google-analytics.com/ga.js';
 ga.setAttribute('async', 'true');
 document.documentElement.firstChild.appendChild(ga);
})();

Это значит, что гугл.аналитикс больше не замедлит загрузку вашего сайта :)
UPD: То есть, он скачивал свой 24кб ga.js во время загрузки страницы, теперь он это может делать после…
Но после первой загрузки, он обычно закэширован и на всех остальных сайтах используется один и тот же :)

Материалы по теме:
Под катом бонус, код для русских поисковиков
Всего голосов 85: ↑73 и ↓12 +61
Просмотры 5.1K
Комментарии 83

Проекты Python в рамках Google Summer of Code — gevent

Python *
Уже весна, а это значит… что скоро лето и очередное Google Summer of Code — возможность получить кучу опыта и даже какое-то материальное вознаграждение. Хочу рассказать об одном интересном проекте, которому вы сможете помочь во время летних каникул — gevent.
Читать дальше →
Всего голосов 30: ↑27 и ↓3 +24
Просмотры 8.4K
Комментарии 24

Планирование задач в сервере при помощи boost.task

C++ *
Недавно на профильном ресурсе один программист задал вопрос: «Что использовать в сервере ММО для работы с потоками?». Программист склонялся к Intel TBB, но даже не к базовым примитивам, а к кастомному планированию задач (task scheduling). Ну нравится TBB — ну и ладно. А немного позже я увидел исходники сервера ММО другого программиста, который недавно начал переписываться его с нуля для улучшения архитектуры. И там было очень много велосипедов, которые писались самим программистом вместо того что бы использовать сторонние компоненты такие как boost (к примеру класы обертки над pthread-ом, и это в 2010 году, когда boost.thread уже почти в стандарте). Была там реализована и поддержка пула потоков с планировщиком задач. Тема эта мне очень интересна и я начал копать информацию о готовых решениях планировки задач (как в TBB) и нашел boost.task, про что и решил написать.
Читать дальше →
Всего голосов 42: ↑39 и ↓3 +36
Просмотры 8.9K
Комментарии 29

Вышла версия 1.0 фреймворка Tornado

Python *
image

Популярный проект, по созданию неблокирующего web-сервера и «сопутствующего» фреймворка на языке Python, объявил о релизе версии 1.0.

Скачать новую версию можно тут: github.com/downloads/facebook/tornado/tornado-1.0.tar.gz

По сравнению с последним релизом версии 0.2, было добавлено множество новшеств,

— возможность запуска WSGI-приложений, под управлением сервера Tornado (например приложения Django и CherryPy)
— улучшенная производительность в MacOS X (с использованием kqueue) и экспериментальная поддержка win32
— переписан класс AsyncHTTPClient
— поддержка .mo файлов в модуле локализации
— поддержка пре-форкинга для запуска нескольких процессов Tornado
— поддержка SSL и gzip в HTTP-сервере

И многое другое.
Всего голосов 40: ↑36 и ↓4 +32
Просмотры 1.5K
Комментарии 10

«Оживление» пользовательского интерфейса

.NET *
image

Приложение не отвечает?!


Многие из тех, кто программирует WPF-приложения, наверное тысячи раз писали конструкцию вида:
{Binding Items}

Если получение элементов коллекции Items выполняется в основном потоке приложения и занимает некоторое время — мы получаем «мертвый» пользовательский интерфейс. Приложение некоторое время не будет отрисовывать изменения состояния и реагировать на пользовательский ввод.
Читать дальше →
Всего голосов 104: ↑97 и ↓7 +90
Просмотры 31K
Комментарии 10

Поддержка MySQL в Node.js: node-mysql-libmysqlclient

Node.JS *
Я довольно долго откладывал этот анонс, однако сейчас настало его время.

Встречайте: node-mysql-libmysqlclient v0.0.7, коннектор к MySQL для Node.js, поддерживающий синхронное и асинхронное выполнение запросов к БД и имеющий API, близкое к API аналогичных коннекторов для PHP/Perl/Ruby etc.

Читать об истории создания и возможностях последней версии коннектора.
Всего голосов 44: ↑41 и ↓3 +38
Просмотры 15K
Комментарии 36

Загрузка скриптов в WebKit

Разработка веб-сайтов *
Перевод
Ночная версия WebKit отныне поддерживает свойства async и defer тэга script, появившиеся в HTML5. Таким образом скорость загрузки страницы возрастает, так как одновременно происходит и загрузка скриптов и рендеринг страницы.
Читать дальше →
Всего голосов 35: ↑32 и ↓3 +29
Просмотры 4.2K
Комментарии 9

Async в C#

.NET *
Продолжение по ссылкам: часть II и часть III.

На PDC2010 Хейсберг объявил, что следующая версия C# будет поддерживать примитивы для удобной организации асинхронных вычислений, кроме анонса была представлена CTP версия расширения для студии (скачать), которая позволяет попробовать улучшенное асинхронное программирование уже сейчас.

Улучшение создано, чтобы облегчить комбинацию асинхронных операций, а так же для того, чтобы асинхронных код выглядел максимально приближенно к синхронному. Учитывая, что Silverlight версия .NET Framework содержит только асинхронную модель для работы с сетью, данное улучшение очень уместно.

Не смотря на то, что упрошенное асинхронное программирование является нововведением в C#, сам подход нельзя назвать инновационным, так как реализация async на основе монад есть в Haskell, F# и Nemerle. На самом деле поддержка языком монад позволяет реализовать даже большее, поэтому я был немного удивлен, когда посмотрел презентацию Хейсберга и понял, что в язык был встроен только частный случай.
Под катом описание async и await
Всего голосов 58: ↑48.5 и ↓9.5 +39
Просмотры 95K
Комментарии 21

Async в C# и SynchronizationContext

.NET *
Продолжение: часть III.

Прошлая заметка о async (часть I) была введением. В этой я продолжу начатую тему: я расскажу о том, что async взаимодействует с SynchronizationContext, и как это влияет на разработку асинхронных графических приложений.

Тестовым полигоном будет пример DiningPhilosophers, который идет вместе с расширением для асинхронного программирования. Это программа — визуализация знаменитой задачи Дейкстры об обедающих философах (ссылка). Прежде, чем читать дальше, лучше ознакомиться с условиями задачи.

image
Читать дальше →
Всего голосов 58: ↑47 и ↓11 +36
Просмотры 43K
Комментарии 3

Геттеры и сеттеры в Javascript

JavaScript *
Javascript — очень изящный язык с кучей интересных возможностей. Большинство из этих возможностей скрыты одним неприятным фактором — Internet Explorer'ом и другим дерьмом, с которым нам приходится работать. Тем не менее, с приходом мобильных телефонов с актуальными браузерами и серверного JavaScript с нормальными движками эти возможности уже можно и нужно использовать прям сейчас. Но по привычке, даже при программировании для node.js мы стараемся писать так, чтобы оно работало в IE6+.

В этой статье я расскажу про интересный и не секретный способ указывать изящные геттеры и сеттеры и немножко покопаемся в исходниках Mootools. Частично это информация взята из статьи John Resig, частично лично мой опыт и эксперименты.
function Foo(bar){
    this._bar = bar;
}

Foo.prototype = {
    get bar () {
        return this._bar;
    },
    set bar (bar) {
        this._bar = bar;
    }
};


Читать дальше →
Всего голосов 104: ↑92 и ↓12 +80
Просмотры 45K
Комментарии 68

App Engine API под капотом

Google App Engine *
Перевод
Этим топиком я хочу открыть серию переводов блога Ника Джонсона. Ник публикует крайне полезные статьи по GAE, делится опытом, ставит необычные экспериметы. Надеюсь, эти материалы будут вам полезны.

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

Общий API-интерфейс



В конечном счете, каждый API-вызов проходит через один общий интерфейс с 4-я аргументами: имя службы (например, 'datastore_v3' или 'memcache'), имя метода (например, 'Get' или 'RunQuery'), запрос и ответ. Запрос и ответ являются буферами протоколов — двоичным форматом, широко используемым в Google для обмена структурированными данными между процессами. Конкретный тип запроса и ответа буферов протокола зависит от вызванного метода. Когда происходит вызов API, буфер протокола запроса формируется из данных, отправленных в запросе, а буфер протокола ответа остается пустым и в дальнейшем заполняется данными, возвращенными ответом API-вызова.
Читать дальше →
Всего голосов 55: ↑49 и ↓6 +43
Просмотры 1.6K
Комментарии 6

Асинхронное программирование, коллбеки и использование process.nextTick()

Node.JS *
Несмотря на то, что большинство из изучающих Node.js в какой-то мере знают JavaScript и имеют опыт использования его в контексте браузеров, при обсуждении практических моментов многие встречаются с трудностями в понимании работы стандартной библиотеки и механизмов обеспечения асинхронного выполнения кода, содержащего множество вложенных коллбеков. Также часто возникает недопонимание, Я постараюсь вкратце описать порядок работы event loop в Node.js и рассказать, на какие моменты стоит обратить внимание при написании качественного асинхронного кода. Думаю, что статья будет полезна и тем, кто занимается написанием производительных фреймворков для браузеров.

Читать дальше →
Всего голосов 44: ↑40 и ↓4 +36
Просмотры 19K
Комментарии 50

Наглядно о потоке выполнения в Node.js

Node.JS *
В комментариях к моему предыдущему топику об асинхронном программировании, коллбеках и использовании process.NextTick() в Node.js было задано немало вопросов о том, за счёт чего получается или может быть получена большая производительность при использовании неблокирующего кода. Постараюсь это наглядно показать :) Статья призвана в основном прояснить некоторые моменты работы Node.js (и libeio в его составе), которые на словах бывает трудно описать.

Пример обработки запросов сервером с блокирующим чтением:


В первую очередь прокомментирую полезность использования неблокирующего ввода/вывода. Как правило, использовать блокирующие операции в Node.js стоит лишь на этапе инициализации приложения, и то не всегда. Правильная обработка ошибок в любом случае потребует использования try/catch, так что код при использовании неблокирующих операций не будет сложнее, чем при использовании блокирующих операций.
Нужно лишь помнить, что случае, когда запросов неблокирующих операций может оказаться больше, чем потоков libeio. В этом случае новые запросы будут становиться в очередь и блокировать выполнение, однако для программиста это будет происходить прозрачно.
Преимущества неблокирующих операций и некоторые недостатки в картинках
Всего голосов 43: ↑38 и ↓5 +33
Просмотры 11K
Комментарии 22

Потоки или события

Программирование *
Существует два способа обрабатывать параллельные запросы к серверу. Потоковые (threaded, синхронные) серверы используют множество одновременно выполняющихся потоков, каждый из которых обрабатывает один запрос. В это время событийные (evented, асинхронные) серверы выполняют единственной цикл событий, который обрабатывает все запросы.

Чтобы выбрать один из двух подходов, нужно определить профиль нагрузки на сервер.
Читать дальше →
Всего голосов 78: ↑75 и ↓3 +72
Просмотры 12K
Комментарии 111

Пример асинхронной монады

Haskell *
Предположим, две программы общаются друг с другом по сети, но не изволят дожидаться ответа, поэтому ответы приходят в произвольном порядке. Чтобы разобраться, что к чему, с сообщением посылается номер, а в ответе шлется номер исходного (на которое отвечаем) сообщения и номер ответа для последующей коммуникации.

Нашей целью является описать последовательность приёма и отправок сообщений при общении с некоторым собеседником, а также иметь возможность использовать ввод/вывод (например, обращение к базе) между приёмами и отправками сообщений.

Как бы в коде на вашем предпочитаемом языке выглядел, например, такой диалог, с учётом того, что в любой момент (между любыми из этих пунктов) могут прийти какие-то другие запросы, которые тоже надо обработать, но не впутать случайно в этот диалог:
1. Посылаем число
2. Приходит число в ответ
3. Посылаем число из п.2 в квадрате
4. В ответ опять число
5. Выводим на консоль сумму чисел п.2 и п.4

Вот как это будет выглядеть на Haskell (функция example, разумеется, неблокирующая):
example :: Int -> AIO ()<br>
example v = do<br>
    x <- request v<br>
    y <- request (* x)<br>
    io $ print (+ y)<br>

Сравните это с блокирующей похожей функцией, которая, к примеру, запрашивает ответ у пользователя:
example :: Int -> IO ()<br>
example v = do<br>
    x <- request v<br>
    y <- request (* x)<br>
    print (+ y)<br>

Расковырять монаду!
Всего голосов 42: ↑38 и ↓4 +34
Просмотры 1.9K
Комментарии 8