WHAT'S NEW?
Loading...

nodejs:blocking vs nonblocking

สรุปแบบตามความเข้าใจของผม ผิดถูกก็ขอโทษด้วยนะครับ




blocking mode ก็คือการที่โปรแกรมเราอะไรสักอย่างหนึ่งแล้วจะทำงาน
  เช่น เขียน server ต้องรอรับ client ส่งข้อมูลมาแล้วถึง แล้วจะทำงานต่อไปได้
non-blocking mode ก็จะไม่รอทำงานตามลำดับไปเรื่อยๆเลย แต่จะมีการใช้ callback กลับมา
โปรแกรมฝัง server ส่วนมากก็จะ ทำได้สองแบบคือ multi-thread กับ non-blocking
แต่ nodejs ไม่สามารถทำ multi-thread  ได้แต่มันดีคือทำ  non-blocking และเป็นแบบ event drivenที่ง่าย มาดูตัวอย่างกันเลย

ตัวอย่างส่วนมากที่เค้ายกเห็นชัดเจนก็การอ่านไฟล์

อ่านไฟล์แบบ blocking : ถ้าอ่านไม่เสร็จก็ยังทำอย่างอื่นต่อไม่ได้

-สร้างไฟล์ข้อมูลมาง่ายๆ ก่อน data.txt ข้อมูลแล้วแต่เราจะใส่ทดลอง

สร้างไฟล์ js อ่านข้อมูล


อธิบายโค้ด
เรียกใช้ คลาส readfile >>>>> require เป็นการเรียกใช้คลาส
สร้าง ตัวแปรเก็บเก็บข้อมูล ใช้เมทอดอ่านไฟล์ readFileSync('ตำแหน่งไฟล์','รูปแบบข้อมูล')
แสดงข้อมูลออกมาก
สุดท้ายให้แสดงข้อความออกมา

ผลลัพธ์
ออกมาตามลำดับต้องอ่านไฟล์เสร็จก่อนแล้วค่อนแสดงข้อความ Test read file 

เราลองมาดู แบบ non blocking กันบ้าง 

อ่านไฟล์แบบ non-bloking : อ่านไฟล์ยังไม่เสร็จก็ทำงานอื่นต่อได้
ใช้ไฟล์ข้อมูลเดิมเลย data.txt

สร้างไฟล์ readdata2.js 

อธิบายโค้ด
เรียกใช้คลาส readFile เหมือนเดิม
ใช้ เมดทอด อ่านไฟล์แล้วสร้าง callback อ่านไฟล์ไม่เสร็จทำงานอื่นต่อได้
แล้วให้แสดงข้อมูลที่อ่านไฟล์
แล้วให้แสดงข้อความ Test read file

ผลลัพธ์ จะเหมือนเดิมมั้ยนะ   


  อ้าว ดันแสดงข้อความ Test read File ก่อนหละ อุส่าไว้ด้านล่างแล้วนะ
ก็อย่างที่บอกแหละครับ มันจะท่านงานแบบไม่รอให้งานหนึ่งเสร็จแต่มันจะทำงานต่ออื่นต่อเลย 

เปรียบเทียบอีกครั้ง

อีกสักตัวอย่างนึงละกัน
ลองตั้งเวลาแล้วแสดงข้อมูลออกมา

อธิบายโค้ด
ตั้งให้โปรแกรม นับถอยหลัง 5 วินาทีแล้ว แสดง hello 1 
หลังจากนั้น แสดง  hello 2

แต่ด้วยการเขียนแบบ non-blocking ทำให้แสดงข้อความ hello 2 ออกมาก่อน โดยไม่ต้องรอ 5 วินาที ของ hello 1




NodeJS:ทำความรู้จักนิดหน่อย

ขอออกตัวก่อนนะครับไม่ใช่ผู้ชำนาญอะไรแต่ อยากทำสรุปส่วนตัวและให้ผู้อื่นด้วย ผิดถูกอย่าว่ากันนะทฤษฏีอาจไม่มีมากนะครับ


Nodejs
       สรุปง่ายๆคือ library javascript ที่สามารถให้เราเขียน javascirpt บนฝั่ง server ได้
ที่ผ่านมาเราจะเขียนฝั่ง client รันบนเว็บ ก็จะมี engine V8 ของทาง  google ที่รันบนbrowserได้
ทีนี้เราจะสร้าง server side ด้วย javascritp นั่นเอง

พื้นฐานต้องรู้เรื่อง javascrpit  มาบ้าง ส่วนตัวผมก็ยังไม่เก่งเลย

ส่ิงที่ node ทำได้

  • สร้าง Websocket Server
  • อัพโหลดไฟล์เร็ว
  • real time data app
  • เขียน non-blocking ได้ง่าย
  • Windows Linux Mac
  • single Thread with Event loop 
ไม่สามารถทำ muti-threaded ได้

แล้วเราจะไปทำอะไรได้บ้างหละ  หลายอย่างครับ
  • web application
  • websocket server
  • proxy server
  • streaming server
  • real time data app
  • แล้วแต่จะเอาไปประยุกต์ละกัน ง่ายๆ ทำเป็น server แหละครับ
เมื่อไหร่จะถึงตอนลง ?
ติดตั้ง
เข้าเว็บโดยตรงเลยครับ nodejs.org 

ถ้ากด  Install เว็บจะให้โหลดอัติโนมัติ
แต่ถ้า Downloads ก็จะมี ให้เลือกหลาย os ครับ  ในเว็บก็สอนเยอะครับลองเข้าไปอ่านดูครับ

หลังจากติดตั้งเสร็จ เราเปิด command พิมพ์ node -v จะแสดง เวอร์ชั่นของ node ถ้าขึ้นแสดงว่าใช้ได้แล้วครับ



ว่าด้วยเรื่องของ npm
ตัว node จะมีตัวจัดการที่ติดมาพร้อมกันคือ  npm เป็นที่จะมาช่วยติดตั้ง packet เสริมให้ nodejs
npm install  ..............  ชื่อ packet ที่จะลงเพิ่ม
เช่นลง express 

npm remove  ............ ชื่อ packet ที่จะลบออก
npm ls ดู packet ที่ติดตั้ง
ตอนนี้เรายังไม่ใช้ packet เสริมยังไม่ต้องลงก็ได้ครับ
ทดสอบเขียนแสดงข้อความเล็กน้อย
node จะสามารถมีตัวเขียนโปรแกรมให้แล้วรันเลย คล้าย python ถ้าใครเคยเขียน พิมพ์แล้ว enter จะรันได้เลย แต่มันจะลำบากหากเขียนโค้ดเยอะ 

ในที่นี้ก็มันเขียนฝั่ง server  อย่างที่ผมเข้าใจ การแสดงค่าก็จะใช้ console.log จริงมีหลายค่า
แบบที่จะเก็บข้อมูลในserver ที่ใช้แสดงข้อความได้ ก็จะมีคำสั่ง

แต่น่าจะตามประเทภมากกว่า

เราก็เขียนเป็นไฟล์ไว้ครับ save เป็น .js 
สร้างไฟล์  test.js


เวลารัน เราต้องอยู่ที่ path ไฟล์ที่เก็บด้วยนะ ของผมอยู่ใน folder node
จะรับก็พิมพ์ node ตามด้วยชื่อไฟล์ของเรา    >>> node test.js  

สร้าง server
ต่อไปลงสร้าง server อย่างง่ายดีกว่า เด๊วบอกว่าเขียน server แล้วไหนละ server

สร้างไฟล์ testserver.js
ตัวอย่างโค้ด


  1. สร้างตัวประเรียกใช้ http 
  2. สร้าง servev แบบเรียกใช้ non-blocking (เด๊วจะอธิบายบทความหน้าให้เห็นความเท่ของ nodejs             non-blocking ง่ายขึ้น)
  3. ตั้ง status code 200 ก็แบบเว็บ 200 ok
  4. ใส่ body ข้อความจะแสดงเมื่อ client เชื่อมต่อเข้ามา
  5. ปิดการทำงาน
  6. รับการเชื่อมต่อ port 8080 แล้วแสดงข้อความ
รัน ไฟล์ได้เลย สอนรันไปแล้วนะครับ
ต่อไปลองเข้า จาก browser 127.0.0.1:8080

หรือจะลองใช้คำสั่งเข้าก็ได้นะ  คำสั่งเข้าเว็บ curl http://127.0.0.1:8080



รู้เรื่องบ้างไม่รู้เรื่องบ้าง ต้องขออภัยด้วยครับ ^___^