evented io - How does the Node.js event loop work? -
after playing node.js , reading async i/o & evented programming a lot i'm left question marks.
consider following (pseudo) code:
var http = require('http'); function onrequest(request, response) { // non-blocking db query query('select name users key=req.params['key']', function (err, results, fields) { if (err) { throw err; } username = results[0]; }); // non-blocking db query query('select name events key=req.params['key']', function (err, results, fields) { if (err) { throw err; } event_name = results[0]; }); var body = renderview(username, event_name, template); res.writehead(200, {'content-type': 'text/plain'}); res.write(body); res.end(); }; http.createserver(onrequest).listen(8888); // request a: http://127.0.0.1:1337/?key=a // request b: http://127.0.0.1:1337/?key=b
(i think) understand basics of event loop; libev, node.js creates event loop polls (epoll/kqueue/...) bunch of file descriptors see if events triggered (new connection, writable, data available etc). if there new request event loop calls anonymous function passed createserver. don't understand happens after:
1) run queries concurrently db driver has have kind of threading/connection pool, right?
2) in scope of 1 request: happens after sending 2 queries? renderview can't called because queries have not returned yet. how wait queries return? should keep count of callbacks pending fired before continuing? basic thought had was;
onrequest -> run async code -> wait callbacks -> construct response. waiting in case blocking need spawn thread each onrequest. how "waiting callbacks run before constructing response" done?
3) how db driver inform event-loop it's done , callback has needs called query results?
4) how event loop run callback inside anonymous function created onrequest event? closure concept comes in context "saved" in callback function?
4) have db results, how continue executing renderview/res.write/res.end
parts?
run parrallel async code pattern:
to 'wait result both async functions' can do: in both async calls callbacks check both result , if ready, call dosomethingwithtwodependantresults.
in example need execute queries sequentially:
query(sql1, function(sqlres1) { query(sql2, function(sqlres2) { writeresultusingdatafrom(sqlres1, sqlres2); } });
your original code, modified execute 2 queries in parallel:
function writereply(res, template, username, event_name) { var body = renderview(username, event_name, template); res.writehead(200, {'content-type': 'text/plain'}); res.write(body); res.end(); } function onrequest(request, response) { // non-blocking db query query('select name users key=req.params['key']', function (err, results, fields) { if (err) { throw err; } username = results[0]; if (username && event_name) writereply(res, template, username, event_name); }); // non-blocking db query query('select name events key=req.params['key']', function (err, results, fields) { if (err) { throw err; } event_name = results[0]; if (username && event_name) writereply(res, template, username, event_name); }); };
Comments
Post a Comment