เมื่อลองเขียน Node.js ครั้งแรก ความแตกต่างจากการเขียนโปรแกรมแบบเดิมๆ

February 16, 2014 4:27 pm Node.js

เมื่อวานผมนั่งเบื่อๆ เซงๆ ไม่มีอะไรทำ เลยหยิบภาษาที่อยากศึกษา ที่เป็นภาษาใหม่ๆ ที่ไม่เคยเขียนมาก่อน เลยนั่งนึกดูว่าภาษาไหนบ้างที่ยังไม่เคยศึกษา ในที่สุด Node.js ก็เข้ามาในหัวของผม หลังจากลองเขียนดู “มันยากกว่าการเขียนภาษาเดิมๆของผมซะอีก” เรามาดูกันครับ ว่ามันมันยากยังไง

Node.js เป็นภาษา JavaScript ที่มาทำงานในฝั่ง server-side การเขียนของมัน หากเขียน JavaScript ได้ดี จะเริ่มศึกษา Node.js ได้โดยไม่ยาก เพราะมันเขียนเหมือน JavaScript แบบเป๊ะๆ เลยหล่ะ ตัวของมัน พัฒนาโดยใช้ Google JavaScript Engine (V8)  โดยหลักของการประมวลผลของมัน จะประมวลผลแบบทีละบรรทัด ตามแบบฉบับของ JavaScript แถมประมวลผลได้เร็วอีกด้วย แต่เพราะไอประมวลผลเร็วนี้แหละ ทำให้เราต้องปรับวิธีการเขียนโปรแกรมใหม่ เพราะ Engine ตัวนี้ใช้วิธีการอ่านไฟล์ทีละบรรทัด แต่จะเลือกทำกระบวนการที่กระทำเสร็จก่อน โดยจะไม่รอให้กระบวนการที่ทำเสร็จ เอาง่ายๆ เรามายกตัวอย่างการทำงานของโปรแกรมกัน

  • โปรแกรมทำงานโดยการโอนถ่ายข้อมูล ขนาด 1Gb.
  • โปรแกรมทำการสร้างไฟล์ขึ้นมาใหม่ ขนาด 100Mb.

ถ้าเป็นการเขียนโปรแกรมแบบปกติ พวก php,ruby มันจะทำงานทีละกระบวนการ แล้วหยุดรอไปก่อน (ในที่นี้จะยกตัวอย่าง php นะครับ เพราะผมถนัด :p) ถ้าอ้างอิงจากโปรแกรมข้างต้นที่กล่าวมาด้านบน จะใช้เวลาในการประมวลผลนานมากๆ กว่าโปรแกรมจะทำงานเสร็จ แต่ถ้าเป็น Node.js มันจะทำการไล่อ่านข้อมูลในไฟล์ทั้งหมด ระหว่างอ่านไฟล์ก็ทำงานไปด้วย อะไรเสร็จก่อน ก็จะเสร็จผลลัพธ์ก่อน อะไรเสร็จหลัง ก็จะขึ้นหลัง ไม่อ้างอิงตามบรรทัด เราเรียกการทำงานแบบนี้ว่า Asynchronous ครับ และที่สำคัญ Node.js ไม่มีการเขียนโปรแกรมแบบ Thread

การทำงานแบบ Asynchronous จะแตกต่างจาก Synchronous ตรงที่ Asynchronous จะให้ความรวดเร็วในการทำงานมากกว่า แต่ก็ต้องแลกด้วยการออกแบบการเขียนใหม่ ว่าเราต้องบล็อกการทำงานในส่วนไหนบ้าง ทำให้คนที่เขียนโปรแกรมแบบ Synchronous ต้องทำความเข้าใจและลำดับการเขียนใหม่ทั้งหมด

เรามาลองเขียนโปรแกรมง่ายๆ อย่างวน Loop ธรรมดาด้วย while กัน แล้วมาทายว่า มันจะแสดงผลอะไรก่อนกัน

setTimeout(function() {
    console.log('Delay Time!!');
}, 100);
 
var i = 0
while(i <= 100) {
	console.log(i)
	i++
}

:: อธิบายการทำงาน ::

  • บรรทัด 1-3 เป็นการ Set ค่าหน่วงเวลาเอาไว้ เพื่อให้สิ่งที่อยู่ใน function นั้น แสดงออกมา ในที่นี้ แสดง Delay Time! ใน Console
  • บรรทัดต่อไปเป็นการวน Loop while ธรรมดา จำนวน 100 ครั้ง

2557-02-16 at 4.17 PMภาพแสดงการทำงานจาก Code ข้างต้น
http://kusumotolab.com/wp-content/uploads/2014/02/2557-02-16-at-4.17-PM.png

จากรูปข้างต้นที่แสดงผลการทำงาน จะเห็นว่า Node.js จะอ่านไฟล์จากบนลงไปจนจบไฟล์ และจะทำงานไปพร้อมๆกัน ถ้าเป็นการเขียนโปรแกรมด้วย php จะมีการหน่วงเวลาก่อน (บรรทัดแรกๆมีการส่งหน่วงเวลา) แล้วค่อยทำขั้นตอนต่อๆไป แต่ Node.js จะทำงานต่อๆไปเลย โดยไม่รอว่า บรรทัดข้างต้นจะทำเสร็จเมื่อไหร่ เอาง่ายๆ อะไรเสร็จก่อน ก็แสดงผลก่อน มันคือการทำงานแบบ Asynchronous ครับ

บทความครั้งหน้า เราจะมาพูดถึงการใช้งาน Node.js แบบประยุกต์กันนะครับ วันนี้ผมไปก่อน ไว้เจอกันบทความหน้าครับ