Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Working with single-threaded event loop

mthenw
September 27, 2014

Working with single-threaded event loop

mthenw

September 27, 2014
Tweet

More Decks by mthenw

Other Decks in Technology

Transcript

  1. event loop no race conditions good for I/O bound tasks

    most web apps bad for CPU intensive tasks
  2. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          console.log(sum);   }   ! logSum(1,  2);
  3. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          console.log(sum);   }   ! logSum(1,  2); logSum(1,  2)
  4. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          console.log(sum);   }   ! logSum(1,  2); logSum(1,  2) add(a,  b)
  5. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          console.log(sum);   }   ! logSum(1,  2); logSum(1,  2) add(a,  b) a  +  b
  6. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);  -­‐>  3          console.log(sum);   }   ! logSum(1,  2); logSum(1,  2) add(a,  b)
  7. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);  -­‐>  3          console.log(sum);   }   ! logSum(1,  2); logSum(1,  2)
  8. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);  -­‐>  3          console.log(sum);   }   ! logSum(1,  2); logSum(1,  2) console.log(sum)
  9. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);  -­‐>  3          console.log(sum);   }   ! logSum(1,  2); logSum(1,  2)
  10. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);  -­‐>  3          console.log(sum);   }   ! logSum(1,  2);
  11. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          setTimeout(function  ()  {            console.log(sum);          },  10);   }   ! logSum(1,  2); Node.js APIs Call stack
  12. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          setTimeout(function  ()  {            console.log(sum);          },  10);   }   ! logSum(1,  2); logSum(1,  2) Node.js APIs Call stack
  13. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          setTimeout(function  ()  {            console.log(sum);          },  10);   }   ! logSum(1,  2); logSum(1,  2) add(a,  b) Node.js APIs Call stack
  14. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          setTimeout(function  ()  {            console.log(sum);          },  10);   }   ! logSum(1,  2); logSum(1,  2) add(a,  b) a  +  b Node.js APIs Call stack
  15. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          setTimeout(function  ()  {            console.log(sum);          },  10);   }   ! logSum(1,  2); logSum(1,  2) add(a,  b) Node.js APIs Call stack
  16. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          setTimeout(function  ()  {            console.log(sum);          },  10);   }   ! logSum(1,  2); logSum(1,  2) setTimeout(func) Node.js APIs Call stack
  17. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          setTimeout(function  ()  {            console.log(sum);          },  10);   }   ! logSum(1,  2); anonymous  func Node.js APIs Call stack
  18. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          setTimeout(function  ()  {            console.log(sum);          },  10);   }   ! logSum(1,  2); anonymous  func Node.js APIs Call stack
  19. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          setTimeout(function  ()  {            console.log(sum);          },  10);   }   ! logSum(1,  2); anonymous  func console.log(sum) Node.js APIs Call stack
  20. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          setTimeout(function  ()  {            console.log(sum);          },  10);   }   ! logSum(1,  2); anonymous  func Node.js APIs Call stack
  21. function  add(a,  b)  {          return  a

     +  b;   }   ! function  logSum(a,  b)  {          var  sum  =  add(a,  b);          setTimeout(function  ()  {            console.log(sum);          },  10);   }   ! logSum(1,  2); Node.js APIs Call stack
  22. setTimeout(function()  {      console.log(‘callback  1')   },  0);  

    ! setTimeout(function()  {      console.log('callback  2')   },  0);
  23. setTimeout(function()  {      console.log('setTimeout  callback')   },  0);  

    ! setImmediate(function()  {      console.log('setImmediate  callback')   }); setImmediate  callback   setTimeout  callback
  24. setTimeout callbacks
 setInterval callbacks I/O callbacks setImmediate callbacks update timers

    process.nextTick callbacks process.nextTick callbacks process.nextTick callbacks
  25. function  MyThing(options)  {      this.setupOptions(options);   !    process.nextTick(function()

     {          this.startDoingStuff();      }.bind(this));   }   ! var  thing  =  new  MyThing();   thing.getReadyForStuff();   ! //  thing.startDoingStuff()  gets  called  now,     //  not  before.
  26. function  definitelyAsync(arg,  cb)  {      if  (arg)  {  

           process.nextTick(cb);          return;      }   !    fs.stat('file',  cb);   }
  27. setTimeout(function  ()  {   !    setImmediate(function()  {   !

           process.nextTick(function  ()  {              console.log('nextTick  called  (1)');          });          console.log('setImmediate  callback');      });   !    setTimeout(function  timeout()  {   !        process.nextTick(function  ()  {              console.log('nextTick  called  (2)');          });          console.log('setTimeout  callback’);      },  0)   },  0);
  28. setTimeout(function  ()  {   !    setImmediate(function()  {   !

           process.nextTick(function  ()  {              console.log('nextTick  called  (1)');          });          console.log('setImmediate  callback');      });   !    setTimeout(function  timeout()  {   !        process.nextTick(function  ()  {              console.log('nextTick  called  (2)');          });          console.log('setTimeout  callback’);      },  0)   },  0);
  29. setTimeout(function  ()  {   !    setImmediate(function()  {   !

           process.nextTick(function  ()  {              console.log('nextTick  called  (1)');          });          console.log('setImmediate  callback');      });   !    setTimeout(function  timeout()  {   !        process.nextTick(function  ()  {              console.log('nextTick  called  (2)');          });          console.log('setTimeout  callback’);      },  0)   },  0);
  30. setTimeout(function  ()  {   !    setImmediate(function()  {   !

           process.nextTick(function  ()  {              console.log('nextTick  called  (1)');          });          console.log('setImmediate  callback');      });   !    setTimeout(function  timeout()  {   !        process.nextTick(function  ()  {              console.log('nextTick  called  (2)');          });          console.log('setTimeout  callback’);      },  0)   },  0);
  31. setTimeout(function  ()  {   !    setImmediate(function()  {   !

           process.nextTick(function  ()  {              console.log('nextTick  called  (1)');          });          console.log('setImmediate  callback');      });   !    setTimeout(function  timeout()  {   !        process.nextTick(function  ()  {              console.log('nextTick  called  (2)');          });          console.log('setTimeout  callback');      },  0)   },  0);
  32. setTimeout(function  ()  {   !    setImmediate(function()  {   !

           process.nextTick(function  ()  {              console.log('nextTick  called  (1)');          });          console.log('setImmediate  callback');      });   !    setTimeout(function  timeout()  {   !        process.nextTick(function  ()  {              console.log('nextTick  called  (2)');          });          console.log('setTimeout  callback');      },  0)   },  0);
  33. setTimeout(function  ()  {   !    setImmediate(function()  {   !

           process.nextTick(function  ()  {              console.log('nextTick  called  (1)');          });          console.log('setImmediate  callback');      });   !    setTimeout(function  timeout()  {   !        process.nextTick(function  ()  {              console.log('nextTick  called  (2)');          });          console.log('setTimeout  callback');      },  0)   },  0);
  34. setTimeout(function  ()  {   !    setImmediate(function()  {   !

           process.nextTick(function  ()  {              console.log('nextTick  called  (1)');          });          console.log('setImmediate  callback');      });   !    setTimeout(function  timeout()  {   !        process.nextTick(function  ()  {              console.log('nextTick  called  (2)');          });          console.log('setTimeout  callback');      },  0)   },  0);
  35. setTimeout callbacks
 setInterval callbacks I/O callbacks setImmediate callbacks update timers

    process.nextTick callbacks process.nextTick callbacks process.nextTick callbacks