As an asynchronous event-driven JavaScript runtime, Node.js builds scalable network applications. In the following “hello world” example, many connections can be handled concurrently. Upon each connection, the callback is fired, but if there is no work to be done, Node.js will sleep.
Node.js is similar in design too. Influenced by systems like Ruby’s Event Machine and Python’s Twisted. Node.js takes the event model a bit further. It presents an event loop as a runtime construct instead of as a library.
In other systems, there is always a blocking call to start the event-loop. Typically, we define behavior through callbacks at the beginning of a script. At the end, a server starts through a blocking call like EventMachine::run().
In Node.js, there is no such start-the-event-loop call. Node.js simply enters the event loop after executing the input script. Node.js exits the event loop when there are no more callbacks to perform. This behavior is like browser JavaScript — the event loop hides from the user.
HTTP is a first-class citizen in Node.js, with streaming and low latency. This makes Node.js well suited for the foundation of a web library or framework.
Node.js, designed without threads, doesn’t mean you can’t take advantage of multiple cores in your environment. Child processes can be spawned by using our child_process.fork() API. They are easy to communicate with. Cluster module allows you to share sockets between processes to enable load balancing over your cores.