คือผมกำลังเขียนโปรแกรม multiprocessing ครับ แต่ผมไม่เคยเขียนมาก่อนเลยครับ
ซึ่งปัญหาที่เจอคือมีการทำงาซ้ำซ้อนครับ การทำงานของผมเป็นดังนี้
- ดึงข้อมูลจากฐานข้อมูล เช่น [1,2,3,4,5,6]
- นำข้อมูลส่งไปเว็บเซอร์วิส
- รับค่าข้อมูลกลับมา
ปัญหา
-ทำงานซ้ำซ้อนกัน มี 100 process ก็ทำเหมือนกันทั้ง 100 เช่น เอาค่า 1 มาส่งไป ws ก็เหมือนกันทั้งหมด 100 process
ผมลองแก้ไขให้เพิ่มสถานะเข้าไป แต่โปรแกรมทำงานไวมากทำให้ปรับสถานไม่ทัน โปรแกรมตัวใหม่ก็เอาตัวที่ทำมาแล้วกลับมาทำอีก
- ทำให้เวลาที่ได้เพิ่มเข้าไปอีก แทนที่จะลดเวลาการทำงานลง
จึงอยากรบกวนทุกท่านช่วยหาแนวทางให้ด้วยครับ
สมัยที่ know how
Architec Tue, 21/06/2016 - 15:48
สมัยที่ know how ของผมเกือบจะเป็นศูนย์ ผมใช้วิธี db ซ้อน db ตัวแรกเป็นฐานข้อมูลธรรมดา อีกตัวใช้คู่กับ thread คุมการเปิดปิด process ทั้งหมด(db on ram) อันไหนใช้ซ้ำๆก็จับลง db ตัวหลัง
ถ้าเป็น Ruby ผมใช้ sidekiq
naiaong Tue, 21/06/2016 - 16:04
ถ้าเป็น Ruby ผมใช้ sidekiq นะครับ
Add jobs ลง Redis.
แล้วให้ process มาหยิบเอาไปทำ
ถ้าเอาถึกๆ เลยก็คือ
AMp Tue, 21/06/2016 - 18:21
ถ้าเอาถึกๆ เลยก็คือ เพิ่มตัวกระจายงานมาอีกตัว แล้วให้ทุก process รับงานจากตัวนี้เท่านั้น (จะผ่าน db หรืออะไรก็แล้วแต่)
ต้องเขียนตัวกระจายงานก่อนครับ
revensoft Tue, 21/06/2016 - 19:42
ต้องเขียนตัวกระจายงานก่อนครับ เลือกวิธีว่าจะกระจายงานให้ 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 เอาละครับ
ขอบคุณมากครับ ทุกๆ ท่าน
khao_lek Wed, 22/06/2016 - 09:18
ขอบคุณมากครับ ทุกๆ ท่าน ผมก็ตามหากระทู้ผมหายไปไหน จริงๆ ผมตั้งไว้ใน python แต่กลับมาโผล่ใน Blognone Forum เดี่ยวผมจะลองศึกษาให้มากกว่านี้ ตอนนี้ก็ได้ความรู้เพิ่มแล้ว แต่นี้คงไม่ทันแน่ขอใช้งานแบบถึกๆไปก่อนครับ แล้วจะไปฝึกเขียนใหม่แล้วจะแจ้งให้ทราบครับ
ลองศึกษา Thread ดีๆ
akira Sat, 25/06/2016 - 10:54
ลองศึกษา Thread ดีๆ ฟังก์ชั่นบางตัวมันใช้จัดคิวได้ แล้วรอก่อนจะทำการบันทึกได้