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
ทำงานถึงไหนแล้ว
หวังว่าจะเป็นประโยชน์ครับ