[บันทึกันลืม] 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 ทำงานถึงไหนแล้ว

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