Ответы пользователя по тегу Асинхронное программирование
  • Какие варианты асинхронной загрузки можно использовать с inline js кодом?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    берем какой-нибудь загрузчик скриптов. Инлайним его в тело страницы. Загружаем им jquery и другие штуки.
    Ответ написан
  • Как правильно работать с Асинхронностью в Node.js?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Разберитесь с event loop для начала

    - колбэки
    - промисы
    - корутины

    Выбирайте, самое сложное и красивое внизу.
    Ответ написан
    Комментировать
  • Как связать angular-сервис с внешним асинхронным модулем?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    использовать $watch на $rootScope

    у вас там событие запускается, а не состояние объекта меняется. Хватит везде и всюду пихать ватчи

    notify через promise

    Он не для этого. Он для того что бы уведомить что скоро будет resolve.

    события $emit, $broadcast

    именно так. Можно сделать свой изолированный скоуп что бы гонять события только между двумя компонентами, не затрагивая остальную систему.
    Ответ написан
    1 комментарий
  • Производительные вебсокеты?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    есть разница между "держать 1000 соединений" и "обслуживать 1000 соединений".

    Между tornado и node.js с архитектурной точки зрения разница не большая - и там и там event loop, и то и то работает в один поток и может использовать только одно ядро. Потому обычно запускают по демону на ядро и разруливают все через реверс прокси (nginx, haproxy). У go - горутины которые используют весь CPU.

    На простом ping-pong сервере разница будет не столь заметна между этими технологиями. Все от задачи зависит и архитектуры приложения. В целом могу предположить что в том же ping-pong у go будет явное преимущество в плане потребления памяти и только.
    Ответ написан
    3 комментария
  • Как дождаться выполнения асинхронного метода?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Q

    image.axd?picture=2012%2F12%2Fkindzadza.
    Ответ написан
    Комментировать
  • Асинхронная многопоточность в PHP: для чего?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Все очень просто. Вот вам приблизительное значение таймингов доступа к данным:
    io-cost.png

    То есть запросив данные в сети мы тупо ждем. Долго ждем и ничего не делаем.

    В случае с curl (он же HTTP) мы можем соорудить очередь запросов и послать их одним махом и ждать пока завершится загрузка всех документов в очереди для обработки результатов. Если мы хотим забрать 10 документов, то без multi curl у нас ушло бы времени "среднее время получения документа" * 10. И это примерно. В случае же с мультикурлом мы получаем время обработки 10 запросов как время выполнения самого долгого запроса. Если представить что время запросов всегда одинаковое, получаем выйгрыш примерно в 10 раз.

    С сокетами веселее. Они бывают блокируемые (по умолчанию) и неблокируемые (выставляется опцией O_NONBLOCK). Для начала давайте определимся что такое чтение данных из сокетов и как нам это дело предоставляет операционная система. Упрощенно, когда мы создаем сокет, мы просто просим операционную систему предоставить оный. У каждого сокета есть буфер чтения и буфер записи. Если буфер записи полный - ОС начинает отправку данных пока буфер не опустеет (буфер записи нужен для организации проверки дошли ли пакеты и переотправки в случае чего, так же этот буфер замешан в выборе операционкой размеров пакетов и т.д. Это не особо важно в контексте вопроса). Когда данные приходят в сокет, сначала они помещаются в буфер чтения. Там они лежат пока их не попросят вернуть из кода. Так мы можем быть уверены в том, что данные не пропадут.

    Так вот... возьмем блокирующие сокеты и попробуем запросить 1024 байт данных из оного. Причем клиент в данный момент ничего не отправляет, буфер чтения пустой. И так допустим минут 10. Как только мы сделали запрос за данными, и оказалось что буфер чтения пустой, процесс выполнения блокируется пока не появятся данные.

    А теперь представим что проверять периодически наличие данных нам надо не в одном сокете а в десятке. Представим так же что 9 клиентов подключенных по нашим сокетам хорошие и присылают данные вовремя, а один не хороший и любит тупить по пол часа. Если бы мы пользовались блокирующими сокетами, то мы можем обрабатывать только одного клиента за раз. Причем если у него вдруг данных не оказалось - нам придется ждать, хотя в других сокетах уже вполне могли появиться данные какие для обработки. И если в случае с "хорошими" клиентами мы можем тратить на оных по пол секунды - секундочке, то наткнувшись на плохого клиента наш сервер замирает за те самые пол часа о которых мы договаривались. Сервер тупо ждет "плохого" клиента а хорошие в итоге не могут достучаться до сервера. Новых соединений мы так же не установим... короче все мертво.

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

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

    Еще есть такая чудная штука, которую предоставляет операционная система как select или epol (в контексте php socket_select и stream_select). Данные функции позволяют нам скармливать массивы сокетов, за которыми вы следите (не сокетов, а их дескрипторов но не суть, и не один массив а три, массив дескрипторов что бы следить появились ли данные на чтение, записал ли сокет все и освободился ли буфер записи и третий отслеживает сокеты в которых произошли какие-то ошибки, например отвалилось соединение). Так же этой функции можно задавать таймаут, что очень удобно если мы сначала собираем данные с нескольких клиентов и если от них небыло вестей пару секунд, значит мы забрали все и можно начинать обработку.

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

    Но все что выше имеет смысл только с TCP/TLS, если бы у нас были UDP сокеты, то было бы еще веселее. Там нету никаких буферов. Не принял данные - потерял данные. Нету соединений. Нету блокировок. Есть только пакеты. Поэтому этот протокол используют (или используют как основу) для реализации реалтайм систем. Задержек нету, а если какой пает не дошел, велика вероятность что он уже не актуален. Правда если сеть не надежная и потери пакетов велики, то начинается боль и слезы и обычно все же для таких случаев дублируют все на TCP.
    Ответ написан
  • Как отправить get запрос, без ожидания ответа (php)?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Если у вас узкое место именно получение данных - можно вооружиться multicurl, и тогда мы можем паралельно делать несколько запросов. Обрабатывать результаты запросов всеравно придется последовательно, так что профит будет только в случае, если get запросы отнимают большую часть времени работы скрипта.

    очереди задач. Скрипт добавляет на обработку задачи в очередь (так как у вас sharer хостинг, думаю штуки типа rabbitmq отпадают, остаются только очереди в базе данных или в reddis, смотря что у вас есть), несколько скриптов обработчиков забирают задачи из очереди и собственно работают. Правда если у вас нельзя выполнять и cli скрипты c set_timeout(0), то тогда этот способ не будет нормально работать.

    ну и уж тем более раз уж речь о shared хостинге, взять что-то типа pthreads или pcntl так же не выйдет. Если выйдет - можно по настоящему распаралелить приложение и получить ощутимый профит.

    JS так же делает это все дело не совсем асинхронно, просто в промежутке между отправкой и получением запроса вы можете что-то делать, но делаться все будет всеравно последовательно, никакого паралелизма из коробки, но там нету и ограничений по времени. Да и не думаю что если у вас есть возможность установить node.js то будет какая-то проблема и на php реализовать.
    Ответ написан
    Комментировать
  • Результат ajax функции как значение условия в JavaScript?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    как вам уже написали выше, промисы идеально подходят для этого. К слову в jquery они есть, и все ajax методы возвращают именно промис.

    Пример
    Ответ написан
    Комментировать
  • Из-за чего проблема с последовательностью событий в js?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вы стали свидетелем одной из оптимизаций современных браузеров.

    http://jsbin.com/OBaMoqe/1 - в комментариях пометил основную суть, но повторюсь

    когда вам нужно выполнить что-то жирное, вы непременно должны вынести это дело из общего контекста выполнения (через setTimeout или предпочтительнее webworkers), иначе остальной код и все события по перерисовке будут ожидать окончания работы этой жирной логики.

    js - асинхронный язык. Вся соль языка в том, что все тяжелые вычисления можно и нужно проводить паралельно.
    Ответ написан
    2 комментария
  • Асинхронная обработка request'а запроса node.js (express)?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    а что за ивент такой, readable? я думал что нужно на data подписываться и считывать тело запроса по кускам (по сути у вас так и выходит).
    Ответ написан
    5 комментариев
  • Асинхронный TCP сервер на C#. Что прочитать? Решен

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вопервых за бесконечные циклы стоит сжигать на кострах. Тут нужно обработчики событий писать/использовать, ибо потребление процессорного времени с бесконечными циклами будет просто ужасно.

    У вас тут должны быть делемы вида «как максимально быстрее передать данные из потока листенера в поток обработчик» а не public/private. Данными можно через колбэки обмениваться. Все радость написатья TCP сервера это калбэки, сихнронизация потоков и прочее.

    А вообще — дочитайте статью. Там вроде бы все эти вопросы рассматриваются.
    Ответ написан
  • Jquery, Синхронный $.getJSON?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Как-то лень думать, но думаю так будет работать:

    var json = (function(data_url){
    var result;
    $.ajax({
    async: false,
    url: data_url,
    dataType: 'json',
    success: function®{
    result = r;
    }
    });

    return result;
    })(url);
    Ответ написан
    1 комментарий