Powered by Drupal, an open source content management system

โฆษณาโดย Google

แก้ปัญหาโปรเซสของ comet ใน nitrogen ไม่ตาย

เจอบั๊กในงานที่ทำอยู่ตอนนี้ ที่ใช้ Nitrogen Web framework for Erlang เป็น framework สำหรับทำเว็บ ซึ่งตัวนี้มันทำ comet ได้ ปัญหาคร่าวๆคือเมื่อเราสร้าง comet เราต้องกำหนดฟังก์ชันให้กับมันเมื่อเราเข้าใช้งานหน้าเว็บหน้านั้น ตัว nitrogen จะทำการแบ่งโปรเซสออกไปสำหรับฟังก์ชันนั้นเพื่อให้เป็นตัวรับ message ระหว่างหน้าเพจกับตัว nitrogen ทีนี้ตัว nitrogen มันดันสร้าง process ใหม่สำหรับ comet ตลอดเมื่อมีการ refresh หรือ หรือเข้าหน้านั้นอีก tab หนึ่ง เมื่อเราปิดหน้านั้นหรือปิดเว็บบราวเซอร์ไปเลย ตัวโปรเซสนี้มันดันไม่ยอมตาย พอมีการส่งข้อความหา comet ชื่อที่กำหนดไว้ตอนแรก มันก็จะส่งข้อความหาทุกๆโปรเซสที่เคยสร้างไว้ แล้วโค้ดใน ฟังก์ชันของ comet ที่ทำเอาไว้คือต้องการให้มัน query ข้อมูลจาก database ผลก็คือยิ่งใช้งานไปเรื่อยๆโปรเซสก็เพิ่มขึ้นไม่หยุด การ query ก็เยอะขึ้นๆทำให้ตัว nitrogen เองเดี้ยงไปเลย

วิธีแก้ที่หาได้ก็คือ ตอนสร้าง comet มันจะรีเทิร์นค่า PID ของ process ออกมาให้เราใช้ฟังก์ชัน timer:kill_after(Time, PID) ช่วยกำหนดเวลาว่าจะ kill process นี้หลังจากผ่านเวลาไปแล้วเท่าไหร่

ตัวอย่างโค้ดที่ใช้งาน

{ok, PID } = wf:comet_global(
    fun() ->
        alarm_loop(wf:q("id"))
    end,
    device_status),

timer:kill_after(330000, PID),