Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Node.js (https://javascript.ru/forum/server/6992-node-js.html)

Kolyaj 15.01.2010 14:19

Лично мне всегда больше нравился путь PHP, когда скопировал файлы рядом и подключил их, нежели путь того же Python, когда сначала нужно что-то установить.

Gvozd 15.01.2010 14:20

Цитата:

Сообщение от Kolyaj
Вот только язык не предрасполагает писать в таком стиле.

ну, в базовом виде, конечно да.
но, это можно обойти при желании.
в нем есть способы для реализации колбеков, и создания простейшего событийного механизма
я специализируюсь в написании парсеров и граберов на PHP, и мною был сделан несложный модуль(базирующийся на multi-CURL, но легко переделываемый под любую другую асинхронность) из нескольких классов, который позволяет посылать одновременно несколько запросов, и обрабатывать по мере прихода.
кодирование сводится к созданию пары новых классов наследующих базовые: для контроля очереди и количества потоков, и для конкретных запросов(с двумя основными методами-создать запрос, и обработать пришедший)
короче, было бы желание, можно и из веревки застрелится))))
на сим я извиняюсь за офтопик, и ухожу из темы.
если интересна моя тема, то прошу в личку, или новую тему

Kolyaj 15.01.2010 14:25

Цитата:

Сообщение от Gvozd
на сим я извиняюсь за офтопик, и ухожу из темы.

Ну почему же оффтопик, асинхронность по отношению к Node.js как раз не оффтопик :)

Опять же, в стандартном режиме работы в PHP на каждый запрос новый поток. Поэтому пока, например, асинхронно читается файл с диска, потоку, по большому счету, делать нечего. Node.js же в это время обрабатывает другие запросы.

Dmitry A. Soshnikov 15.01.2010 14:25

Цитата:

Сообщение от kurokikaze
Имхо стандарт должен определять синтаксис и модель языка, а не список доступных модулей. Так что библиотека может быть и внешней - главное чтобы основные модули были доступны сразу с Node, а дополнительные - по требованию.

Ну, все built-in модули стандарт описывает (и 3-я и 5-я редакции). Вопрос лишь в том, до какой степени создавать стандартную библиотеку в built-in режиме, а что - оставить для написания 3rd-party разработчикам.

К примеру, Ruby имеет большую стандартную библиотеку (хотя, всё это могло бы быть написано чисто на Руби, а сам Руби был бы небольшим ядром; кстати, где-то недавно видел финальный драфт спецификации по Руби, не знаю, описывались ли там все built-in модули или нет). Python тоже имеет немалую built-in библиотеку и часть py-built-in.

Цитата:

Сообщение от kurokikaze
Кстати, работа над package manager для Ноды уже идёт.

Угу, спасибо, посмотрю. Это какой-то альтернативный менеджер пакетов (в смысле, есть ли стандартный для Node.js)? Автор - Вы? Если да, развивайте - есть хорошая возможность занять нишу.

Цитата:

Сообщение от kurokikaze
А насчёт реализации - там Global interpreter lock, как в Питоне.

Угу, т.е., всё-таки, лочится на определённом моменте, а дальше может делаться fork текущего процесса?

Gvozd 15.01.2010 14:52

Цитата:

Сообщение от Kolyaj
не оффтопик

ну раз так, то продолжаем обмен мнениями)))
Цитата:

Сообщение от Kolyaj
Опять же, в стандартном режиме работы в PHP на каждый запрос новый поток. Поэтому пока, например, асинхронно читается файл с диска, потоку, по большому счету, делать нечего. Node.js же в это время обрабатывает другие запросы.

да, PHP этого не умеет.
на каждый запрос всегда создается либо отдельный поток(модуль), либо отдельный процесс(CGI)
fast-CGI (хотя он не совсем в тему к асинхронным возможностям Node.js) в PHP насколько я знаю не реализован и опция такая поставлена "для заглушки"
НО! Пока конкретный экземпляр скрипта простаивает в ожидании данных из файла, остальные потоки/процессы продолжают обрабатывать запросы, что обеспечивается многопоточностью самой ОС/веб-сервера
Использовать же один процесс для обработки нескольких запросов вперемешку(а не последовательно как в fast-CGI), считаю плохой идеей, по-крайней мере если нету эффективного инструмента для отделения глобальных переменных от переменных индивидуальных для каждого запроса.

в любом случае, использование асинхронности в PHP является достаточно нетипичным, и если уж используется, то как правило пока идет чтение файла(ов), можно делать(и нужно) какое-то полезное действие(обработка прочитанных блоков,действия не зависящие от файла)

Kolyaj 15.01.2010 15:10

Цитата:

Сообщение от Gvozd
fast-CGI (хотя он не совсем в тему к асинхронным возможностям Node.js) в PHP насколько я знаю не реализован и опция такая поставлена "для заглушки"

Если так, то совсем всё плохо.

Цитата:

Сообщение от Gvozd
НО! Пока конкретный экземпляр скрипта простаивает в ожидании данных из файла, остальные потоки/процессы продолжают обрабатывать запросы, что обеспечивается многопоточностью самой ОС/веб-сервера

Так они и при синхронной работе то же самое делают.

Цитата:

Сообщение от Gvozd
Использовать же один процесс для обработки нескольких запросов вперемешку(а не последовательно как в fast-CGI), считаю плохой идеей, по-крайней мере если нету эффективного инструмента для отделения глобальных переменных от переменных индивидуальных для каждого запроса.

// созданные здесь переменные будут глобальными для всех запросов
http.createServer(function() {
    // созданные здесь переменные будут локальными для каждого запроса.
})
А вот обмен данными между запросами в PHP уже можно реализовать только через базу/файлы.

Порог входа, разумеется, получается выше чем у PHP, но зато возможностей гораздо больше.

Gvozd 15.01.2010 15:29

Цитата:

Сообщение от Kolyaj
А вот обмен данными между запросами в PHP уже можно реализовать только через базу/файлы.

есть достаточно мало задач, где бы могло понадобится взаимодействие между происходящими в данный момент запросами.
поэтому как правило БД и файлов вполне достаточно
тем не менее, можно использовать для этого механизм семафоров и общей памяти, хотя не разу им не пользовался, и не в курсе, насколько он эффективен
HEAP-таблицы вполне пригодны для обмена переменными
также в случае CGI можно попытаться писать в stdin-поток других экземпляров скриптов, но не уверен

Kolyaj 15.01.2010 15:39

А мне вот интересно. Simon Willison приводит бенчмарк для сервера, отдающего "Hello, World" через 2 секунды
http.createServer(function(req, res) {
  setTimeout(function() {
    res.sendHeader(200, {'Content-Type': 'text/html'});
    res.sendBody('<h1>Hello World</h1>');
    res.finish();
  }, 2000);
}).listen(8080);
У кого-нибудь есть под рукой инструменты, чтобы проверить PHP в той же ситуации?
<?php
sleep(2);
echo "Hello, World";

moro 06.02.2010 14:36

проверял на mac book pro:
node.js Requests per second: 49.72 [#/sec] (mean)
php Requests per second: 38.97 [#/sec] (mean)

Kolyaj 06.02.2010 19:15

moro,
спасибо, результаты радуют.

Цитата:

Сообщение от moro
node.js Requests per second: 49.72 [#/sec] (mean)

Близко к результатам Симона и к максимально возможному количеству.


Часовой пояс GMT +3, время: 13:49.