Pull to refresh
  • by relevance
  • by date
  • by rating

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

ВсеИнструменты.ру corporate blog High performance *PHP *MySQL *

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

Читать далее
Total votes 18: ↑17 and ↓1 +16
Views 4.9K
Comments 6

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

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

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

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

Отлично, теперь мы имеем представление о том что это и поэтому решаем использовать асинхронную модель как наиболее эффективную, но чем больше мы разбираемся с ней тем больше подводных камней встречаем.
Читать дальше →
Total votes 20: ↑6 and ↓14 -8
Views 507
Comments 28

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

.NET *F# *

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



Читать дальше →
Total votes 48: ↑40 and ↓8 +32
Views 5K
Comments 15

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

IT-companies
Новый код выглядит вот так:
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 во время загрузки страницы, теперь он это может делать после…
Но после первой загрузки, он обычно закэширован и на всех остальных сайтах используется один и тот же :)

Материалы по теме:
Под катом бонус, код для русских поисковиков
Total votes 85: ↑73 and ↓12 +61
Views 2.8K
Comments 83

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

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

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

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

И многое другое.
Total votes 40: ↑36 and ↓4 +32
Views 1.4K
Comments 10

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

.NET *
image

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


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

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

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

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

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

Читать об истории создания и возможностях последней версии коннектора.
Total votes 44: ↑41 and ↓3 +38
Views 15K
Comments 36

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

Website development *
Translation
Ночная версия WebKit отныне поддерживает свойства async и defer тэга script, появившиеся в HTML5. Таким образом скорость загрузки страницы возрастает, так как одновременно происходит и загрузка скриптов и рендеринг страницы.
Читать дальше →
Total votes 35: ↑32 and ↓3 +29
Views 4.1K
Comments 9

Async в C#

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

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

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

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

Async в C# и SynchronizationContext

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

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

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

image
Читать дальше →
Total votes 58: ↑47 and ↓11 +36
Views 41K
Comments 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;
    }
};


Читать дальше →
Total votes 104: ↑92 and ↓12 +80
Views 40K
Comments 68

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

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

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

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



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

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

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

Читать дальше →
Total votes 44: ↑40 and ↓4 +36
Views 18K
Comments 50

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

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

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


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

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

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

Чтобы выбрать один из двух подходов, нужно определить профиль нагрузки на сервер.
Читать дальше →
Total votes 78: ↑75 and ↓3 +72
Views 12K
Comments 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>

Расковырять монаду!
Total votes 42: ↑38 and ↓4 +34
Views 1.7K
Comments 8

Как применять Linux epoll в Python

Python *
Translation
Tutorial
В статье описывается:
  • Примеры использования блокирующих сокетов
  • Преимущества асинхронных сокетов и Linux epoll
  • Примеры асинхронного использования сокетов через epoll
  • Вопросы производительности
  • Исходный код
Читать дальше →
Total votes 54: ↑49 and ↓5 +44
Views 22K
Comments 30

Вышел IE10 PP2: WebWorkers, Drag & Drop, File API, CSS3 Positioned Floats, HTML5 Forms и многое другое

Microsoft corporate blog
(хотя на Хабре уже есть короткий пост-заметка про выход IE10 PP2, в этой статье мы хотим дать более корректный и полный обзор того, что нового появилось именно в IE10 PP2).

И так, в соответствии с заявленным сроком выпуска PP-версий для следующих версий IE раз в ~12 недель, мы выпустили очередное обновление. Выглядит IE10 PP2 также как и все предыдущие версии Platform Preview, а самое интересное, как всегда, внутри – обновленный движок Internet Explorer:



Ссылка на загрузку
Читать дальше →
Total votes 63: ↑46 and ↓17 +29
Views 11K
Comments 28