ชำแหละความสามารถด้าน Concurrency ของ 'Elixir'
(underjord.io)- บทความนี้พูดถึงประสบการณ์ของผู้เขียนกับภาษาโปรแกรม Elixir โดยเน้นไปที่ความสามารถด้าน concurrency และ parallelism
- ผู้เขียนใช้ Elixir เป็นภาษาโปรแกรมหลักมาตลอด 5-6 ปีที่ผ่านมา และยอมรับทั้งประสิทธิภาพและข้อเสียที่มีอยู่น้อยมาก
- ผู้เขียนเปรียบเทียบโมเดล concurrency ของ Elixir กับ PHP และ Python โดยระบุว่าโมเดล concurrency ของ PHP พึ่งพาเว็บเซิร์ฟเวอร์ ขณะที่ Python ประสบปัญหาด้าน concurrency เพราะ Global Interpreter Lock (GIL)
- Elixir สร้างขึ้นบน Erlang และ Erlang virtual machine (BEAM) ซึ่งถูกออกแบบมาเพื่อรัน lightweight process จำนวนมาก จึงเป็นรากฐานของ concurrency และ parallelism
- เมื่อเริ่มทำงาน BEAM จะสร้าง thread สำหรับ scheduler ขึ้นมา และโดยค่าปริยายจะจัดการ scheduling process หนึ่งชุดต่อ CPU core ที่ใช้งานได้หนึ่งคอร์
- ผู้เขียนอธิบายว่าคุณลักษณะด้าน functional programming แบบ immutable ของ Elixir และ Erlang เป็นตัวเลือกที่ถูกเลือกมาอย่างเหมาะสมเพื่อให้บรรลุ concurrency และ parallelism ในระดับสูง
- process ใน Elixir จะไม่แชร์สถานะร่วมกัน และสามารถสื่อสารกันแบบ asynchronous ได้ผ่านการส่ง message เท่านั้น ทำให้มั่นใจได้ถึงการรันแบบ concurrent และ parallel อย่างปลอดภัย
- ผู้เขียนชี้ว่าเวลาที่เขียนโค้ดด้วย Elixir โดยมาก web request ส่วนใหญ่จะเกิดขึ้นภายใน process เดียว ดังนั้นจึงแทบไม่ต้องกังวลกับหลักการพื้นฐานเหล่านี้มากนัก
- Elixir มีกลไก async/await สำหรับงาน concurrent ซึ่งถูก implement อยู่ในโมดูล Task และมีฟังก์ชัน
Task.async_streamสำหรับรัน Task กับแต่ละรายการที่สามารถ enumerate ได้ - ผู้เขียนสรุปว่าตัวเลือกด้าน concurrency และ parallelism ที่ยอดเยี่ยมของ Elixir และ Erlang ไม่ใช่สิ่งที่มาคิดเพิ่มทีหลัง แต่ถูกสร้างไว้ในพื้นฐานของ runtime ตั้งแต่แรก ทำให้ concurrency บน BEAM ไม่ได้อันตรายหรือยากลำบาก
ยังไม่มีความคิดเห็น