Как работает асинхронная обработка запросов в реальных случаях? - PullRequest
0 голосов
/ 04 января 2019

Большинство уроков, которые я видел для Узел JS / ReactPHP , больше похоже на то, что вам не нужно ждать 5-секундный таймер, чтобы что-то повторить. EventLoop может справиться с этим позже.

Как в следующем примере (обратите внимание, это не зависит от языка):

timer(run 5 seconds later){
    print 'username';
}
print ', another text';

// non A-Sync output is like = 'username, another request'
// A-Sync output is like = ', another requestusername'

Но это тот же файл, внутри которого мы работаем. Что, если мы подключимся к разъему ввода-вывода.

Как в этом примере: (requestfile.js)

connectSocket(takes 5 seconds to return a result){
    print result;
}

//end of the file

Ну, у меня есть 2 вопроса здесь (для меня неважно реагирует php или nodejs, для меня имеет значение асинхронный)

1- Если мы получаем 2 пользовательских запроса, первый подключается и ждет 5 секунд, может ли A-Sync выполнить второй запрос в этом же потоке, ожидая ответного обратного вызова для первого запроса. (или только асинхронный означает, что вы можете выполнять независимые операции внутри одного файла, например: печатать нижний колонтитул при подключении этого сокета в течение 5 секунд)

2- В каком ядре / потоке работает EventLoop? Независимо от темы запроса. Если нет, то как не потерять процесс Eventloop? Кто (Thread / Core) контролирует это, если сокет вернул значение? Может ли EventLoop запускаться каждую секунду для проверки обратных вызовов? (Я думал, не имеет значения, насколько это быстро, но машинный код работает с линейной синхронизацией (один за другим))

1 Ответ

0 голосов
/ 04 января 2019
  1. Цикл обработки событий позволяет вашему приложению ответить на второй запрос, пока первый еще обрабатывается. Это возможно, потому что все операции ввода-вывода ожидают обратного вызова, который будет выполнен, когда операция будет завершена. Node.js и PHP могут запускать только один поток (изначально), но считают, что он может иметь только один стек вызовов одновременно. Обратите внимание, что когда вы передаете обратный вызов функции, вы разрешаете очистить весь стек вызовов и, следовательно, также разрешаете запуск другого кода. Пример:

    function callback (result) {
        console.log(result);
    }
    
    function handleRequest (request) {
        doSomethingAsync(callback);
    }
    

    Обратите внимание, что при вызове doSomethingAsync стек вызовов будет выглядеть примерно так:

    • doSomethingAsync
    • handleRequest
    • некоторый каркасный метод
    • ...
    • какой-то каркасный метод

    После возврата doSomethingAsync (асинхронная операция еще не завершена) также возвращается handleRequest, и все стековые методы платформы также могут возвращаться, но обратный вызов еще не был вызван. Когда асинхронная операция завершится, обратный вызов будет вызван с чистым стеком вызовов (в случае узла - для ReactPHP у вас также будут вызовы цикла событий в стеке).

  2. Цикл обработки событий содержит очередь ожидающих задач и запускает одну задачу только после завершения предыдущей. Когда вы вызываете асинхронную функцию, вы косвенно добавляете новую задачу в очередь задач цикла событий. Таким образом, текущая задача ДОЛЖНА завершиться, чтобы завершить асинхронную операцию. Также важно понимать, что цикл обработки событий никогда не прерывает задачу для вызова обратного вызова. Обратный вызов вызывается только после завершения предыдущей задачи (т. Е. Стек вызовов становится пустым).

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

...