Non-blocking Addons Example?

609 views
Skip to first unread message

Felix Halim

unread,
Mar 29, 2012, 4:49:15 AM3/29/12
to nod...@googlegroups.com
Currently, my C++ program communicates with my node.js app via stdin/stdout.
So, my node.js app instantiate my C++ program using child_process and
use its stdin/stdout.

Recently, I played with node.js addons:

http://nodejs.org/api/addons.html

and discovered that a simple "a + b" program can be up to 50x faster
implemented as addons
compared to C++ program that uses scanf / printf and communicate via
stdin/stdout.

So, I am really motivated to use addons for the communications!
However, my C++ program has interaction with disk (has to perform I/O).

The current node.js documentation above doesn't have an example
on how to use addons + libuv to do a non-blocking addons.

Can anyone give a simple example of non-blocking addons?

Thanks,

Felix Halim

Tim Caswell

unread,
Mar 29, 2012, 9:43:51 AM3/29/12
to nod...@googlegroups.com
Native addons are in the same process as node which means all the benefits and drawbacks that brings.

As you noted, using a child process is good if the child is going to block since it won't block node.  Also the child process can use a different CPU core than node for true parallel work.  However there is significant overhead to having a new process and serializing all data back and forth.  In process addons are much more efficient but share the same process.  The C++/JS boundary is somewhat expensive (though nothing like serializing data across processes).  Once in the main node process it's very bad to block the process because it defeats the purpose of the event loop if any one call blocks for a long time.

There is one solution using threads in the addon.  Libuv has APIs to help with this.  Look at uv_work_t and friends.  The node zlib module uses uv threads to perform compression in a background thread. <https://github.com/joyent/node/blob/master/src/node_zlib.cc>

Too much use of the thread pool can be bad for a program, so take all considerations in moderation.

-Tim Caswell


--
Job Board: http://jobs.nodejs.org/
Posting guidelines: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nod...@googlegroups.com
To unsubscribe from this group, send email to
nodejs+un...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Paul Hauner

unread,
Apr 12, 2016, 12:37:55 PM4/12/16
to nodejs
Hi Felix,
 I have made an example which demonstrates a non-blocking async C++ node addon. 
This example implements the callback pattern.


I hope it helps :)
Paul

Felix Halim

unread,
Apr 17, 2016, 6:21:40 PM4/17/16
to nod...@googlegroups.com
Hi Paul,

Thanks for the examples, but this thread is like 4 years old :)

I've decided to use libuv directly for my C++11 needs and expose them via HTTP as web API.
Then the nodejs app (or any other app) can use the web API to communicate.
This design actually far better than using addons since I get to define the API for the communications.

Here is my generic http-server in C++11 that wraps libuv (it supports async requests see the test_server.cc):


It has been running for ~2 years now and is pretty stable in production:


Felix Halim

You received this message because you are subscribed to the Google Groups "nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+un...@googlegroups.com.
To post to this group, send email to nod...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/nodejs/fb605601-a446-482a-afd6-6dd3d2ee7251%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages