คือผมกำลังเขียนโปรแกรม multiprocessing ครับ แต่ผมไม่เคยเขียนมาก่อนเลยครับ
ซึ่งปัญหาที่เจอคือมีการทำงาซ้ำซ้อนครับ การทำงานของผมเป็นดังนี้
- ดึงข้อมูลจากฐานข้อมูล เช่น [1,2,3,4,5,6]
- นำข้อมูลส่งไปเว็บเซอร์วิส
- รับค่าข้อมูลกลับมา
ปัญหา
-ทำงานซ้ำซ้อนกัน มี 100 process ก็ทำเหมือนกันทั้ง 100 เช่น เอาค่า 1 มาส่งไป ws ก็เหมือนกันทั้งหมด 100 process
ผมลองแก้ไขให้เพิ่มสถานะเข้าไป แต่โปรแกรมทำงานไวมากทำให้ปรับสถานไม่ทัน โปรแกรมตัวใหม่ก็เอาตัวที่ทำมาแล้วกลับมาทำอีก
- ทำให้เวลาที่ได้เพิ่มเข้าไปอีก แทนที่จะลดเวลาการทำงานลง
จึงอยากรบกวนทุกท่านช่วยหาแนวทางให้ด้วยครับ
สมัยที่ know how ของผมเกือบจะเป็นศูนย์ ผมใช้วิธี db ซ้อน db ตัวแรกเป็นฐานข้อมูลธรรมดา อีกตัวใช้คู่กับ thread คุมการเปิดปิด process ทั้งหมด(db on ram) อันไหนใช้ซ้ำๆก็จับลง db ตัวหลัง
ถ้าเป็น Ruby ผมใช้ sidekiq นะครับ
Add jobs ลง Redis.
แล้วให้ process มาหยิบเอาไปทำ
ถ้าเอาถึกๆ เลยก็คือ เพิ่มตัวกระจายงานมาอีกตัว แล้วให้ทุก process รับงานจากตัวนี้เท่านั้น (จะผ่าน db หรืออะไรก็แล้วแต่)
ต้องเขียนตัวกระจายงานก่อนครับ เลือกวิธีว่าจะกระจายงานให้ process ต่างๆ ทำอะไรกันบ้างจากนั้นถึงค่อยแจกจ่ายงานไปให้ process ต่างๆ ครับ เช่น
ผมจะทำ 1 + 2 + 3 ... 1,000,000 โดยผมกำหนดจำนวน process ตายตัวที่ 4 processes โดยมีการกระจายงานให้ P1(Process 1) นั้น + 1 ... 250,000, P2 + 250,001 ... 500,000, P3 + 500,001 ... 750,000 และ P4 + 750,001 ... 1,000,000
เมื่อแต่ละ process ทำงานจบแล้วก็จะส่งค่าไปยัง array รับค่าซึ่งแต่ละ process ก็จะส่งค่าเข้าช่องของตัวเองโดยมีตัวรับงานคอยตรวจว่าค่ามาครบทุกจากนั้นจึงส่งค่ากลับ process หลักเป็นอันจบกระบวนการ
ปล. ผมเข้าใจว่าเป็น Multi-Thread นะครับ ถ้า Multi-process จริงๆ คงต้องส่งค่าผ่าน memory mapped file เอาละครับ
ขอบคุณมากครับ ทุกๆ ท่าน ผมก็ตามหากระทู้ผมหายไปไหน จริงๆ ผมตั้งไว้ใน python แต่กลับมาโผล่ใน Blognone Forum เดี่ยวผมจะลองศึกษาให้มากกว่านี้ ตอนนี้ก็ได้ความรู้เพิ่มแล้ว แต่นี้คงไม่ทันแน่ขอใช้งานแบบถึกๆไปก่อนครับ แล้วจะไปฝึกเขียนใหม่แล้วจะแจ้งให้ทราบครับ
ลองศึกษา Thread ดีๆ ฟังก์ชั่นบางตัวมันใช้จัดคิวได้ แล้วรอก่อนจะทำการบันทึกได้