Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how do i create a non-blocking asynchronous function in node.js?

Tags:

How do I create a non-blocking asynchronous function? Below is what I'm trying to achieve but my program is still blocking...

var sys = require("sys");  function doSomething() {   sys.puts("why does this block?");   while(true); }  setTimeout(doSomething,0); setTimeout(doSomething,0); setTimeout(doSomething,0);  sys.puts("main"); 
like image 243
Richard Avatar asked May 20 '10 21:05

Richard


People also ask

What is asynchronous non-blocking functions in Node JS?

Non-Blocking methods are executed asynchronously. Asynchronously means that the program may not necessarily execute line by line. The program calls the function and move to the next operation and does not wait for it to return.

How do you write non-blocking code in node JS?

Ways to create actual non-blocking code in node. js: Run it in a separate child process and get an asynchronous notification when it's done. Use the new experimental Worker Threads in node.

How do you write asynchronous function in node JS?

The asynchronous function can be written in Node. js using 'async' preceding the function name. The asynchronous function returns implicit Promise as a result. The async function helps to write promise-based code asynchronously via the event-loop.

Is asynchronous non-blocking?

We usually think that "Blocking, non-blocking, Synchronous, Asynchronous" are the same. But, This perspective is wrong. It is unrelated concepts each other. It is difficult and confusing concepts.


2 Answers

Cross-posted from Reddit.


The purpose of asynchronous functions in JavaScript is a little bit different from what you seek.

Remember that JavaScript is single-threaded — it can only do one thing at a time. Here is some traditional, blocking code:

sys.puts("Before"); sleep(10); sys.puts("After"); 

In a real-world web application, the sleep() might instead be a time-consuming database call, network request (like waiting for data from the user’s web browser), helper tool, or file access.

If you used blocking calls like the above, the Node.js server would’t be able to do anything else (like starting to handle other web requests) while waiting.

PHP and many other web programming environments handle this by creating totally separate threads for each request. Node.js uses callback functions. You could write the same code like this, instead:

sys.puts("Before"); setTimeout(function(){     sys.puts("After"); }, 10000); 

Here, you create a function and pass it to setTimeout(). Its code hasn’t run yet, but when it does, it will have access to all the scope (all the variables) where it was created. setTimeout() gets a reference to the function and schedules an event to fire on the event loop after the timeout expires.

The event loop is, essentially, a Node.js program’s to-do list (they’re common — all the GUI applications running on your computer probably use event loops!).

After the call to setTimeout(), the current function keeps executing. It eventually returns, and the function which called it returns, and so on, until the program ends up back in the event loop. The event loop looks to see if anything has happened (e.g. an incoming request) while your code was executing, and calls the appropriate function in your code. If not, it waits until something does happen (like the timeout expiring).

Asynchronous code doesn’t let your code do many things at the same time, it does eliminate blocking when some code depends on something external to continue.

It’s rare that you need to do blocking work inside your Node.js program. If you do, you should separate that work out into a separate process (which can even be another Node.js program), or write a C/C++ addon which is free to use threads.

like image 177
s4y Avatar answered Sep 27 '22 21:09

s4y


You can only do asynchronous IO in node.js by using asynchronous IO functions provided by node.js runtime or node.js extensions written in C++. Your own Javascript code is always synchronous in node.js. Asynchronous non-IO code is rarely needed, and node.js designers decided to avoid it at all.

There are some arcane ways of running Javascript asynchronously in node.js, mentioned by other commenters, but node.js is not designed for this type of work. Use Erlang if you need that type of concurrency, node.js is only about paralell IO, and for parallel computations it is just as bad as Python or PHP.

like image 42
nponeccop Avatar answered Sep 27 '22 20:09

nponeccop