Node.js
http://kolyaj.ya.ru/replies.xml?item_no=2953
Цитата:
|
Спасибо, надо будет выделить время, тоже покапаться с серверным JS. Вкратце, конечно, читал обзоры, но не смотрел (и тем более, глубоко).
Основной принцип - они расширили какой-то движок (V8 в данном случае) новым функционалом и запускают этот интерпретатор на серваке? Какие ещё альтернативы есть (тут, вроде недавно была похожая тема с каким-то другим серверным JS)? Какие лучшие? Что за фреймворки? Кто пишет? Как их писать? Так же, как и для клиентского JS? update: Посмотрел исходники. |
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Я вот эту тему имел в виду: http://javascript.ru/forum/project/6...zhenijj-2.html Там тоже наподобие - какой-то движок расширен (возможно, Rhino, т.к. там фигурирует Java тоже; хотя, это лучше в той теме интересоваться)? Node.js тоже как-то с облачной платформой связан? А в чём принципиальное отличие этой облачной платформы от этого Node.js? |
Цитата:
Цитата:
Цитата:
|
Цитата:
Но с точки зрения JS-кода - это просто событийное программирование, где всё разруливается коллбэками и для JS это всё подаётся, как "один" поток? Ок, будет время, поизучаю глубже. Вообще, ECMAScript-у ничего не мешает дописать стандартную библиотеку (до уровня Ruby, Python) и расширить сферу использования, включая серверное программирование. Имею в виду, официально, по стандарту (хотя, в ближайшее время это вряд ли будет) + чтобы появилась пара-тройка признанных фреймворков - тогда JS с лёгкостью будет отличной альтернативой PHP/Python/Ruby на сервере. |
Цитата:
А насчёт реализации - там Global interpreter lock, как в Питоне. Впрочем, если сравнивать side-by-side, Нода по производительности делает питоновский асинхронный Торнадо. |
Цитата:
используя неблокируемые сокеты, вы можете достаточно сносно работать со многими вещами, используя асинхронность: файлы, сеть, процессы проблема в том, что эта облать документации слабо документирована, и работает не всегда стабильно. примеров в сети также не сильно много. но, это возможно |
Цитата:
Цитата:
|
Цитата:
|
Лично мне всегда больше нравился путь PHP, когда скопировал файлы рядом и подключил их, нежели путь того же Python, когда сначала нужно что-то установить.
|
Цитата:
но, это можно обойти при желании. в нем есть способы для реализации колбеков, и создания простейшего событийного механизма я специализируюсь в написании парсеров и граберов на PHP, и мною был сделан несложный модуль(базирующийся на multi-CURL, но легко переделываемый под любую другую асинхронность) из нескольких классов, который позволяет посылать одновременно несколько запросов, и обрабатывать по мере прихода. кодирование сводится к созданию пары новых классов наследующих базовые: для контроля очереди и количества потоков, и для конкретных запросов(с двумя основными методами-создать запрос, и обработать пришедший) короче, было бы желание, можно и из веревки застрелится)))) на сим я извиняюсь за офтопик, и ухожу из темы. если интересна моя тема, то прошу в личку, или новую тему |
Цитата:
Опять же, в стандартном режиме работы в PHP на каждый запрос новый поток. Поэтому пока, например, асинхронно читается файл с диска, потоку, по большому счету, делать нечего. Node.js же в это время обрабатывает другие запросы. |
Цитата:
К примеру, Ruby имеет большую стандартную библиотеку (хотя, всё это могло бы быть написано чисто на Руби, а сам Руби был бы небольшим ядром; кстати, где-то недавно видел финальный драфт спецификации по Руби, не знаю, описывались ли там все built-in модули или нет). Python тоже имеет немалую built-in библиотеку и часть py-built-in. Цитата:
Цитата:
|
Цитата:
Цитата:
на каждый запрос всегда создается либо отдельный поток(модуль), либо отдельный процесс(CGI) fast-CGI (хотя он не совсем в тему к асинхронным возможностям Node.js) в PHP насколько я знаю не реализован и опция такая поставлена "для заглушки" НО! Пока конкретный экземпляр скрипта простаивает в ожидании данных из файла, остальные потоки/процессы продолжают обрабатывать запросы, что обеспечивается многопоточностью самой ОС/веб-сервера Использовать же один процесс для обработки нескольких запросов вперемешку(а не последовательно как в fast-CGI), считаю плохой идеей, по-крайней мере если нету эффективного инструмента для отделения глобальных переменных от переменных индивидуальных для каждого запроса. в любом случае, использование асинхронности в PHP является достаточно нетипичным, и если уж используется, то как правило пока идет чтение файла(ов), можно делать(и нужно) какое-то полезное действие(обработка прочитанных блоков,действия не зависящие от файла) |
Цитата:
Цитата:
Цитата:
// созданные здесь переменные будут глобальными для всех запросов http.createServer(function() { // созданные здесь переменные будут локальными для каждого запроса. })А вот обмен данными между запросами в PHP уже можно реализовать только через базу/файлы. Порог входа, разумеется, получается выше чем у PHP, но зато возможностей гораздо больше. |
Цитата:
поэтому как правило БД и файлов вполне достаточно тем не менее, можно использовать для этого механизм семафоров и общей памяти, хотя не разу им не пользовался, и не в курсе, насколько он эффективен HEAP-таблицы вполне пригодны для обмена переменными также в случае CGI можно попытаться писать в stdin-поток других экземпляров скриптов, но не уверен |
А мне вот интересно. 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"; |
проверял на mac book pro:
node.js Requests per second: 49.72 [#/sec] (mean) php Requests per second: 38.97 [#/sec] (mean) |
moro,
спасибо, результаты радуют. Цитата:
|
Так он быстрей чем PHP или я что-то не так понял?
|
Ну я в V8 не сомневался, вопрос был насколько быстрей.
|
Цитата:
голый hello-world с задержкой-не показатель основные направления: 1)вывод "голого" HTML 2)задача на парсинг кода(мегабайт кода с одинаковыми вычислениями) 3)голые циклы 4)задача на скорость простейших арифметических вычислений(цикл с небольшим количеством вычислений) и оценивать надо не количеством запросов в секунду(это во многом зависит еще и от апача), а продолжительностью выполнения, и потраченными CPU |
Цитата:
|
sys = require('sys'); var start = Date.now(); for(var i = 0; i < 10000000; i++){ a = 0; b = a + 100; c = b*b; d = c + 123456; e = d/987; f = e*e; } sys.puts((Date.now() - start)/1000); list($usec, $seconds) = explode(" ", microtime()); $start = ((float)$usec + (float)$seconds); for($i = 0; $i < 10000000; $i++){ $a = 0; $b = $a + 100; $c = $b*$b; $d = $c + 123456; $e = $d/987; $f = $e*$e; } list($usec, $seconds) = explode(" ", microtime()); $end = ((float)$usec + (float)$seconds); echo $end - $start; Запускалось из командной средний результат: node.js - 0.57 php - 3.71 Не знаю как точно оценить использование cpu, но когда я увеличивал размер цикла, чтобы успеть посмотреть, монитор показывал примерно одинаковые проценты использования cpu. Вместо a = 0, ставил a = i, результаты примерно такие же: 0.64 3.96 |
Цитата:
Цитата:
используется ф-ция getrusage(), являющаяся интерфейсом одноименной ф-ции. не знаю, есть ли такая фишка в node.js moro, могу я вас попросить провести также и первые три теста? мне интересен их результат . особенно второго |
Цитата:
|
тестовый код давайте, сделаю
|
Цитата:
то есть он при старте парсится в байт-код, который уже дальше и выполняется? |
Цитата:
Поэтому для удобной отдачи статики перед Node не помешает nginx, ну или придётся писать отдельный контроллер для статики, что лишнее, т.к. со статикой прекрасно справляется nginx. |
да это программа, каждый раз не запускается как php скрипт, для проверки
var sys = require('sys'); var http = require('http'); var a = 1; http.createServer(function (req, res) { res.sendHeader(200, {'Content-Type': 'text/plain'}); res.sendBody('a: ' + a); a++; res.finish(); }).listen(8000); при каждом запросе переменная a будет увеличиваться |
Цитата:
<? $fp1=fopen('test.php','w'); $fp2=fopen('test.js','w'); fwrite($fp1,"<?\r\n"); fwrite($fp1,"list(\$usec, \$seconds) = explode(\" \", microtime());\r\n"); fwrite($fp1,"\$start = ((float)\$usec + (float)\$seconds);\r\n"); fwrite($fp2,"sys = require('sys');\r\n"); fwrite($fp2,"var start = Date.now();\r\n"); $op=array('+','-','*','/','%'); for($i=97;$i<=122;$i++) { fwrite($fp1,'$'.chr(rand(97,122))."=0;\r\n"); fwrite($fp2,'var '.chr(rand(97,122))."=0;\r\n"); } $string='$'.chr(rand(97,122)).'='.'$'.chr(rand(97,122)).$op[array_rand($op)].rand(1,1000000).";\r\n"; for($i=0;$i<1000000;$i++) { $a=chr(rand(97,122)); $b=chr(rand(97,122)); $c=$op[array_rand($op)]; $d=rand(1,1000000).'.'.rand(1,10000); $string='$'.$a.'='.'$'.$b.$c.$d.";\r\n"; fwrite($fp1,$string); $string=$a.'='.$b.$c.$d.";\r\n"; fwrite($fp2,$string); } fwrite($fp1,"list(\$usec, \$seconds) = explode(\" \", microtime());\r\n"); fwrite($fp1,"\$end = ((float)\$usec + (float)\$seconds);\r\n"); fwrite($fp1,"echo \$end - \$start;"); fwrite($fp1,"?>"); fwrite($fp2,"sys.puts((Date.now() - start)/1000);\r\n"); ?> |
заменил rand(97,122) на $i в первом цикле, а то пишет что переменные не определены некоторые.
использовал следующий код для запуска, чтобы измерить полное время парсинга/загрузки/выполнения скрипта sys = require('sys') var start = Date.now(); sys.exec('node test.js').addCallback(function(output){//sys.exec('php test.php') sys.puts(output); sys.puts((Date.now() - start)/1000); }); результат (в сек) Код:
node.js 0.024 - время выполения показаное скриптом |
ну, чтож.
Nodejs весьма хорош, чтобы на нем можно было писать посмотрел список существующих на данный момент модулей огорчило отсутствие SAX Самый главный минус вижу, только в низкой степени популяризации. Мало кто из заказчиков приемлет проект написанный на нем. но для себя, я думаю смогу найти применение этому инструменту |
Цитата:
Цитата:
|
есть libxmljs http://libxmljs.squishtech.com/
|
Цитата:
|
Список модулей растёт не по дням, а по часам, что не может не радовать.
|
Можно добавить node.js в рамках платформы Хайвекст. Соответственно появится выбор между двумя движками Rhino и V8 (node.js) + сервисы и другие возможности станут доступны также в node.js
|
Hivext Technologies,
а это имеет смысл? Основная фишка -- асинхронность, у вас, я так понимаю, ею не пахнет. |
Часовой пояс GMT +3, время: 22:12. |