การทำงานแบบ Multi-Thread นั้น ใช้ทรัพยากรของเครื่องพอสมควร
ยิ่งคุณแบ่ง Thread ออกมากเท่าไหร่ ทั้ง Memory ทั้ง CPU Time ก็จะถูกแบ่งกระจายออกมาไปมากเท่านั้น
หากงานไม่มีจำนวนมาก ๆ ไม่ได้ใช้เวลาทำงานนานก็ไม่น่าจะใช้งาน Multi-Thread
ดังนั้นควรจะใช้ให้ถูกวิธี และลองคิดแบบตั้งสมมติฐาน บนพื้นฐานความจริงกัน บวกกับปัจจัยต่าง ๆ ที่ต้องคำนึงถึง
ตัวอย่าง เรากำลังจะเปรียบเทียบ การทำงานแบบเน้นจำนวนงาน เพื่อหาผลลัพธ์ของเวลาที่ทำงานได้ในทั้ง 2 วิธี ต่อไปนี้
อย่างตัวอย่างของคุณ DFox เวลาที่ใช้ในแต่ละงานนั้น เป็นเวลาในการทำงานสั้น ๆ จำนวนงานน้อย งานไม่หนัก ไม่ค้างรอผลลัพธ์นาน
ถ้างานที่ติดต่อกับ 3 DB แยกกันอยู่ 3 Server
มี 1 task ต่อ 1 DB
มี Process Time ประมาณ 1 วินาที
วิธีแบบ synchronous (1 Thread)
– เวลาที่ใช้ในการ process tasks รวมกันก็ ไม่เกิน 3 วินาที
– มีการ share memory ด้วยกัน ใช้ environment ของ thread เดียวกัน
– CPU Time ใช้เต็มที่ 100% ของเวลาที่จัดสรรมาได้จาก OS
วิธีแบบ Asynchronous ( 3 Threads)
– เวลาที่ใช้ในการ Process Tasks รวมกัน ไม่เกิน 1 วินาที
– เวลาการสร้าง Thread ทั้ง 3 Threads ใช้เวลา x3 เวลา ไม่แน่ใจว่าเท่าไหร่
– มีการจองเพื่อใช้ Memory เพิ่มขึ้น 1- 2 เท่า ใช้เวลาในการจองพื้นที่ x2 เวลา ไม่แน่ใจว่าเท่าไหร่
– CPU Time (time slice) ที่ได้มา 100% จะถูกหาร 3 แบ่งเวลาไปให้แต่ละ Thread ใช้ทำงาน
คุณจะเห็นได้ว่าคุณใช้ Asynchronous (Multi-Thread) กับงานนี้ไม่ค่อยเหมาะสมเท่าไหร่
มาลองดูตัวอย่างงานที่ใช้ Asynchronous (Multi-Thread) แล้วน่าจะทำงานได้เหมาะกว่า
ถ้างานที่ติดต่อกับ 3 DB แยกกันอยู่ 3 Server
มี 20 tasks ต่อ 1 DB
มี Process Time ที่ต้องค้างรอ ต่อ 1 task ประมาณ 5-10 วินาที ( คิดเฉลี่ยที่ 7.5 ละกัน)
วิธีแบบ synchronous (1 Thread)
– เวลาที่ใช้ในการ process tasks รวมกันก็ ไม่เกิน 20 tasks x 3 db x 7.5 วิ = 450 วินาที
– มีการ share memory ด้วยกัน ใช้ environment ของ thread เดียวกัน
– CPU Time ใช้เต็มที่ 100% ของเวลาที่จัดสรรมาได้จาก OS
วิธีแบบ Asynchronous ( 3 Threads)
– เวลาที่ใช้ในการ Process Tasks รวมกัน ไม่เกิน 20 tasks x 1(พร้อมกัน) x 7.5 วิ = 150 วินาที
– เวลาการสร้าง Thread ทั้ง 3 Threads ใช้เวลา x3 ไม่แน่ใจว่าเท่าไหร่
– มีการจองเพื่อใช้ Memory เพิ่มขึ้น 1- 2 เท่า ใช้เวลาในการจองพื้นที่ x2 เวลา ไม่แน่ใจว่าเท่าไหร่
– CPU Time (time slice) ที่ได้มา 100% จะถูกหาร 3 แบ่งเวลาไปให้แต่ละ Thread ใช้ทำงาน
จะเห็นได้ว่างานที่มีจำนวนมาก และมีเวลาที่ไม่คงที่ผันเปลี่ยนไปตามค่าปัจจัยต่าง ๆ และมีแนวโน้มว่าจะ long run จริง ๆ แล้ว
ซึ่งคิดว่าน่าจะมีความเหมาะสมที่ใช้ Multi-thread มาช่วยในการทำงาน ซึ่งจะช่วยลดเวลาได้จริงครับ
ยังมีอีกหลายงานที่เราใช้ การทำงานแบบ Asynchronous มาช่วยอีกมากมาย
ทั้งใน User Interface เพื่อแยกการแสดงผล กับ process บางตัวที่ long run เพื่อช่วยให้ มีการตอบสนองการทำงานที่รวดเร็ว ไม่ต้องค้างรอ
เช่น msn รับ msg จากเพื่อนที่คุยมา show ตลอด และเราก็สามารถที่จะคุยโต้ตอบได้ทันทีโดยไม่ต้องรอ เป็นต้น
ก็ขอให้อ่านทำความเข้าใจ บวกกับทำทดลองให้เกิดความจริง
เพื่อที่จะใช้ technique, feature ของ programming ต่าง ๆ ได้ถูกต้องกับงานครับผม
ปล. ถ้าว่างเมื่อไหร่จะทำ ตัวอย่างจับเวลามาให้ดูครับ