Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.02.2018, 12:10
Новичок на форуме
Отправить личное сообщение для vitalyas Посмотреть профиль Найти все сообщения от vitalyas
 
Регистрация: 25.02.2018
Сообщений: 7

Как работает асинхронность?
Приветствую всех кто просматривает эту тему!
Разъясните пожалуйста следующую ситуацию: да юзера, с разных компов открывают одновременно страницу сайта на ноде, они получат ее одновременно? то есть второй юзер не будет ждать пока, первый получит страницу?
По идее не должен, но почему если для одного юзера есть цикл, то второй ждет пока цикл для первого отработает, хотя для второго нет цикла?
Ведь есть такие ситуации когда на странице нужно вывести в цикле какие то данные для конкретно юзера.
Знаю что это все решается, но как? Где можно почитать, разобраться?Направьте в нужное русло.
Вот мой код:
router.post('/authenticate', function(req, res) {
    User.findOne({email: req.body.email, password: req.body.password}, function(err, user) {
        if (err) {
            res.json({
                type: false,
                data: "Error occured: " + err
            });
        } else {
            if (user) {
                if(user._id == '5a924c98fa27cb2520e56e7d') {

                    for(;;) {

                    }
                }

                console.log('ok1');
                user.setTolken();
                user.token = jwt.sign({
                    email: user.email,
                    password: user.password,
                    id: user._id,
                    time: new Date().getMilliseconds()
                }, process.env.JWT_SECRET, {
                    expiresIn: 60, // 1 week
                    algorithm: 'HS256'
                });
                user.save(function(err, user1) {
                    res.json({
                        type: true,
                        data: user1,
                        token: user1.token
                    });
                });

                console.log('ok5');
                res.json({
                    type: true,
                    data: user,
                    token: user.token
                });

            } else {
                res.json({
                    type: false,
                    data: "Incorrect email/password"
                });
            }
        }
    });
});


Как видно в коде есть бесконечный цикл который блокирует все, для всех юзеров, хотя условие стоит блокировка только для конкретного айдишника
Ответить с цитированием
  #2 (permalink)  
Старый 25.02.2018, 12:20
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

А не знаю, как это будет работать на ноде, но в браузере этот js ничего не заблокирует, но загрузит процессор на 100%.
Если node также работает, то ничего удивительного в том, что ваш сервер не отвечает.

Зачем так сношать машину?
Ответить с цитированием
  #3 (permalink)  
Старый 25.02.2018, 12:36
Новичок на форуме
Отправить личное сообщение для vitalyas Посмотреть профиль Найти все сообщения от vitalyas
 
Регистрация: 25.02.2018
Сообщений: 7

Дело в том, что если делать все то же на пхп, то второй юзер получит ответ и не будет ждать пока цикл выполнится для первого.
В данном коде просто проверка как работает nodejs, так сказать первые шаги, метод проб. nodejs изучаю первую неделю, после нескольких лет разработки на php. Поскольку nodjs однопоточный, то этот цикл лочит и второй юзер ждет первого. Как этого избежать? Процесс блокирует только цикл или без цикла тоже один юзер ждет другого?
Ответить с цитированием
  #4 (permalink)  
Старый 25.02.2018, 13:21
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Сообщение от vitalyas
Дело в том, что если делать все то же на пхп, то второй юзер получит ответ и не будет ждать пока цикл выполнится для первого.
Только потому, что в пхп апач создаст отдельный процесс (или thread) для второго запроса. А если вы возьмёте ReactPHP, то там будет то же самое (и то и другое - однопоточное, хоть и асинхронное). Поэтому я и не стал даже смотреть на все эти новомодные штуки - слишком они критичны к ошибкам подвешивания всех клиентов (и, наверное, к утечкам памяти). Хотя при правильном использовании, конечно, они помогут выжать максимум пользы из процессора.

Избежать - не использовать долгих циклов и использовать асинхронность по максимуму.
Ответить с цитированием
  #5 (permalink)  
Старый 25.02.2018, 13:26
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Сообщение от Nexus
А не знаю, как это будет работать на ноде, но в браузере этот js ничего не заблокирует,
Тоже заблокирует
alert('go');
for(;;){}
alert('end');
Ответить с цитированием
  #6 (permalink)  
Старый 25.02.2018, 13:33
Новичок на форуме
Отправить личное сообщение для vitalyas Посмотреть профиль Найти все сообщения от vitalyas
 
Регистрация: 25.02.2018
Сообщений: 7

В итоге получается, что обычный console.log(), при запросе двумя юзерами выполнится последовательно в одном процессе, сначала для первого, потом для второго, а не параллельно, как в двух одновременных процессах пхп?
Ответить с цитированием
  #7 (permalink)  
Старый 25.02.2018, 13:36
Новичок на форуме
Отправить личное сообщение для vitalyas Посмотреть профиль Найти все сообщения от vitalyas
 
Регистрация: 25.02.2018
Сообщений: 7

Перефразирую. Получается что в ноде нельзя выполнить операции, результат которых нужно вывести в браузер, одновременно для разных юзеров
Ответить с цитированием
  #8 (permalink)  
Старый 25.02.2018, 13:58
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Сообщение от Белый шум
Тоже заблокирует
Я видимо неправильно выразился.
Хотел сказать, что если процесс на 100% грузит CPU, то ничего удивительного в том, что другие пользователи в это время не могут получить ответ от машины нет.

Заставить машину ожидать какое-то время (видимо бесконечное) путем запуска бесконечного цикла - как минимум глупость, тем более в php.

Не знаком с nodejs и желания знакомиться нет, но я сильно сомневаюсь, что все запросы полностью обрабатывает 1 процесс.
Ответить с цитированием
  #9 (permalink)  
Старый 25.02.2018, 14:07
Новичок на форуме
Отправить личное сообщение для vitalyas Посмотреть профиль Найти все сообщения от vitalyas
 
Регистрация: 25.02.2018
Сообщений: 7

Демон на пхп, это бесконечный цикл. Процесс висит в озу и делает свои задачи и не грузит проц на 100%. Где глупость?
Ответить с цитированием
  #10 (permalink)  
Старый 25.02.2018, 14:34
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Сообщение от vitalyas
В итоге получается, что обычный console.log(), при запросе двумя юзерами выполнится последовательно в одном процессе, сначала для первого, потом для второго, а не параллельно, как в двух одновременных процессах пхп?
Да

Сообщение от Nexus
Хотел сказать, что если процесс на 100% грузит CPU, то ничего удивительного в том, что другие пользователи в это время не могут получить ответ от машины нет.
В стандартном php получат, ибо разные процессы (или нити).

Сообщение от Nexus
Заставить машину ожидать какое-то время (видимо бесконечное) путем запуска бесконечного цикла - как минимум глупость, тем более в php.
Можно поставить sleep - результат будет тем же.

Сообщение от Nexus
Не знаком с nodejs и желания знакомиться нет, но я сильно сомневаюсь, что все запросы полностью обрабатывает 1 процесс.
Разумеется, можно запустить несколько процессов и балансировать нагрузку между ними тем же nginx. Но их все можно подвесить, если там есть такой код. В стандартном php есть лимиты, которые это разрулят, а в этих решениях таких защит не предусмотрено by design (если я правильно ошибаюсь).
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как это работает? )) innowed Общие вопросы Javascript 3 03.02.2017 14:15
Как работает NodeJS erkesh Node.JS 2 24.07.2016 18:31
Как же работает fireViewEvent() в ViewController Пролетарий ExtJS 10 06.06.2015 17:18
опишите, как работает функция Egor1324 AJAX и COMET 5 18.02.2015 08:29
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25