mirror of
https://github.com/nodejs/node.git
synced 2024-11-29 15:06:33 +01:00
154 lines
7.5 KiB
HTML
154 lines
7.5 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<style>
|
|
ul {
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
</style>
|
|
<link type="image/x-icon" rel="icon" href="../favicon.ico">
|
|
<link type="image/x-icon" rel="shortcut icon" href="../favicon.ico">
|
|
<link rel="stylesheet" href="../pipe.css">
|
|
<link rel="stylesheet" href="../sh.css">
|
|
<link rel="alternate"
|
|
type="application/rss+xml"
|
|
title="node blog"
|
|
href="http://feeds.feedburner.com/nodejs/123123123">
|
|
<title>node.js</title>
|
|
</head>
|
|
<body class="alt int" id="about">
|
|
<div id="intro" class="interior">
|
|
<a href="/" title="Go back to the home page">
|
|
<img id="logo" src="http://nodejs.org/images/logo-light.png" alt="node.js">
|
|
</a>
|
|
</div>
|
|
<div id="content" class="clearfix">
|
|
<div id="column2" class="interior">
|
|
<ul>
|
|
<li><a href="/" class="home">Home</a></li>
|
|
<li><a href="/#download" class="download">Download</a></li>
|
|
<li><a href="/about/" class="about current">About</a></li>
|
|
<li><a href="http://search.npmjs.org/" class="npm">npm Registry</a></li>
|
|
<li><a href="http://nodejs.org/api/" class="docs">Docs</a></li>
|
|
<li><a href="http://blog.nodejs.org" class="blog">Blog</a></li>
|
|
<li><a href="/community/" class="community">Community</a></li>
|
|
<li><a href="/logos/" class="logos">Logos</a></li>
|
|
<li><a href="http://jobs.nodejs.org/" class="jobs">Jobs</a></li>
|
|
</ul>
|
|
<p class="twitter"><a href="http://twitter.com/nodejs">@nodejs</a></p>
|
|
</div>
|
|
|
|
<div id="column1" class="interior">
|
|
<h1>Node's goal is to provide an easy way to build scalable
|
|
network programs</h1>
|
|
|
|
|
|
<p>In the "hello world" web server example
|
|
below, many client connections can be handled concurrently.
|
|
Node tells the operating system (through <code>epoll</code>,
|
|
<code>kqueue</code>, <code>/dev/poll</code>, or
|
|
<code>select</code>) that it should be notified when a new
|
|
connection is made, and then it goes to sleep. If someone new
|
|
connects, then it executes the callback. Each connection is
|
|
only a small heap allocation.</p>
|
|
|
|
<pre>
|
|
var http = require('http');
|
|
http.createServer(function (req, res) {
|
|
res.writeHead(200, {'Content-Type': 'text/plain'});
|
|
res.end('Hello World\n');
|
|
}).listen(1337, "127.0.0.1");
|
|
console.log('Server running at http://127.0.0.1:1337/');</pre>
|
|
<p>This is in contrast to today's more common concurrency
|
|
model where OS threads are employed. Thread-based networking
|
|
is relatively inefficient and very difficult to use. See: <a
|
|
href="http://www.kegel.com/c10k.html">this</a> and <a
|
|
href="http://bulk.fefe.de/scalable-networking.pdf">this</a>.
|
|
Node will show much better memory efficiency under high-loads
|
|
than systems which allocate 2mb thread stacks for each
|
|
connection. Furthermore, users of Node are free from worries
|
|
of dead-locking the process—there are no locks. Almost no
|
|
function in Node directly performs I/O, so the process never
|
|
blocks. Because nothing blocks, less-than-expert programmers
|
|
are able to develop fast systems.</p>
|
|
|
|
<p>Node is similar in design to and influenced by systems like
|
|
Ruby's <a href="http://rubyeventmachine.com/">Event
|
|
Machine</a> or Python's <a
|
|
href="http://twistedmatrix.com/">Twisted</a>. Node takes the
|
|
event model a bit further—it presents the event loop as a
|
|
language construct instead of as a library. In other systems
|
|
there is always a blocking call to start the event-loop.
|
|
Typically one defines behavior through callbacks at the
|
|
beginning of a script and at the end starts a server through a
|
|
blocking call like <code>EventMachine::run()</code>. In Node
|
|
there is no such start-the-event-loop call. Node simply enters
|
|
the event loop after executing the input script. Node exits
|
|
the event loop when there are no more callbacks to perform.
|
|
This behavior is like browser javascript—the event loop is
|
|
hidden from the user.</p>
|
|
|
|
<p>HTTP is a first class protocol in Node. Node's HTTP library
|
|
has grown out of the author's experiences developing and
|
|
working with web servers. For example, streaming data through
|
|
most web frameworks is impossible. Node attempts to correct
|
|
these problems in its HTTP <a
|
|
href="https://github.com/joyent/http-parser/tree/master">parser</a>
|
|
and API. Coupled with Node's purely evented infrastructure, it
|
|
makes a good foundation for web libraries or frameworks.</p>
|
|
|
|
<p>But what about multiple-processor concurrency? Aren't
|
|
threads necessary to scale programs to multi-core computers?
|
|
You can start new processes via <code><a
|
|
href="http://nodejs.org/api/child_process.html#child_process.fork">child_process.fork()</a></code>
|
|
these other processes will be scheduled in parallel. For load
|
|
balancing incoming connections across multiple processes use
|
|
<a href="http://nodejs.org/api/cluster.html">the
|
|
cluster module</a>.</p>
|
|
|
|
<p>See also:</p>
|
|
<ul>
|
|
<li><a href="http://s3.amazonaws.com/four.livejournal/20091117/jsconf.pdf">Slides from JSConf 2009</a></li>
|
|
<li><a href="http://nodejs.org/jsconf2010.pdf">Slides from JSConf 2010</a></li>
|
|
<li><a href="http://www.yuiblog.com/blog/2010/05/20/video-dahl/">Video from a talk at Yahoo in May 2010</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div id="footer">
|
|
<ul class="clearfix">
|
|
<li><a href="/">Node.js</a></li>
|
|
<li><a href="/#download">Download</a></li>
|
|
<li><a href="/about/">About</a></li>
|
|
<li><a href="http://search.npmjs.org/">npm Registry</a></li>
|
|
<li><a href="http://nodejs.org/api/">Docs</a></li>
|
|
<li><a href="http://blog.nodejs.org">Blog</a></li>
|
|
<li><a href="/community/">Community</a></li>
|
|
<li><a href="/logos/">Logos</a></li>
|
|
<li><a href="http://jobs.nodejs.org/">Jobs</a></li>
|
|
<li><a href="http://twitter.com/nodejs" class="twitter">@nodejs</a></li>
|
|
</ul>
|
|
|
|
<p>Copyright <a href="http://joyent.com">Joyent, Inc</a>, Node.js is a <a href="/trademark-policy.pdf">trademark</a> of Joyent, Inc. View <a href="https://raw.github.com/joyent/node/__VERSION__/LICENSE">license</a>.</p>
|
|
</div>
|
|
|
|
|
|
<script src="../sh_main.js"></script>
|
|
<script src="../sh_javascript.min.js"></script>
|
|
<script>highlight(undefined, undefined, 'pre');</script>
|
|
|
|
<script>
|
|
var gaJsHost = (("https:" == document.location.protocol) ?
|
|
"https://ssl." : "http://www.");
|
|
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
|
</script>
|
|
<script>
|
|
try {
|
|
var pageTracker = _gat._getTracker("UA-10874194-2");
|
|
pageTracker._trackPageview();
|
|
} catch(err) {}
|
|
</script>
|
|
</body>
|
|
</html>
|