Day: January 19, 2023

  • [บันทึกันลืม] Shell script เพื่อทำงาน parallel ด้วย screen

    Parellel processing

    เมื่อเราเขียน shell script เพื่อทำหลาย ๆ งานพร้อมกัน เช่น มีข้อมูล 1,000,000 รายการ ถ้าวิธีแบบ Sequential ก็เริ่มจาก 1, 2, 3, …, 1,000,000 ซึ่งก็จะเสียเวลามาก เพราะต้องรอให้ งานที่ 1 เสร็จก่อน แล้วถึงไปทำงานที่ 2, 3 ถ้าแต่ละงานให้เวลา 1 วินาที ก็ต้องใช้เวลา 1,000,000 วินาที กว่าจะเสร็จ

    แต่ถ้าเราแบ่ง เป็น 100 process ย่อย ๆ แต่ละ process จัดการ 10,000 รายการ ก็จะใช้เวลาลดลง (เมื่อ resources เหลือเฟือ) ทั้งนี้ก็ขึ้นกับประสิทธิภาพเครื่องคอมพิวเตอร์ด้วย

    เช่น เรามี process.py หน้าตาประมาณนี้

    import time
    import sys
    def processing(start_position, steps):
        # something blah
        for i in range(start_position, start_position+steps):
            print(f'processing {i}')
            time.sleep(1)
    
    def main():
        start_position=sys.argv[1]
        steps=sys.argv[2]
        processing(start_position, steps)
    
    if __name__ == "__main__":
        main()
    

    เดิมเราก็จะใช้เครื่องหมาย & เพื่อทำให้ไปอยู่ background

    !/bin/bash
    for i in $(seq 1 100); do
        python3 process.py $i 10000 &
    done
    

    ปัญหาคือ เราจะไม่สามารถดูได้ว่า ตอนนี้ แต่ละ process ไปถึงไหนแล้ว

    screen

    screen เป็น Utility ที่ทำให้เราสามารถส่งคำสั่งไปทำงาน แล้วค่อยสลับเข้าไปดูได้ เทคนิคการใช้งานคำสั่ง screen บน Linux

    เราก็เปลี่ยนจากการใช้ & ต่อท้าย เป็น screen แทนดังนี้

    !/bin/bash
    for i in $(seq 1 100); do
        screen -S p$i -dm python3 process.py $i 10000
    done
    
    

    วิธีนี้ ทำให้สามารถใช้คำสั่ง

    screen -ls
    

    และ

    screen -r p1
    

    เพื่อเข้าไปดูว่า ตอนนี้ process p1 ทำงานถึงไหนแล้ว

    หวังว่าจะเป็นประโยชน์ครับ