Multi Processing (การใช้งาน & Stable Code)

Multi Processing : คือการรันโปรแกรม พร้อม ๆ กันหลาย ๆ โปรแกรม ซึ่ง Python Selenium รองรับการใช้งานตรงนี้อย่างสมบูรณ์แบบ และจากการใช้งานจริง ที่ผ่านมานั้น Selenium สามารถรัน Process ได้มากกว่า 10 Process พร้อม ๆ กัน ได้อย่างสบาย แต่ต้องตรวจสอบ CPU & RAM Usage ว่าไม่ควรเกิน 70% เพื่อไม่ให้เกิด Resource ไม่พอใช้งาน และเกิด Dead Lock ขึ้น

จากโปรแกรมด้านล่าง เป็นโปรแกรม Multi Processing Control โดย สามารถเพิ่มเติม หรือปรับแต่ง ข้อมูลได้ดังนี้:

1. เขียนโปรแกรมหลักที่ต้องการทำงาน เช่น program1.py, program2.py, program3.py (ชื่อตั้งขึ้นเป็นตัวอย่าง)

2. เอาชื่อของโปรแกรมที่ต้องการรันมาใส่ใน List : itmes ใน Code ด้านล่าง

3. กำหนด Max Process ในการรันพร้อม ๆ กัน ตัวอย่างด้านล่างกำหนดรันพร้อม ๆ กัน 2 program

Code Feature :

  • กำหนด Max Process ในการรันพร้อมกันได้
  • กำหนดรายชื่อ Program ที่จะรันได้ผ่าน List หรือ ปรับให้รับค่าจาก ไฟล์อื่น ๆ ได้
  • จะมีการรัน Program ใหม่อีกรอบในกรณีที่รันรอบแรกแล้วเกิด Error

Code ด้าน่ล่าง ผ่านการใช้งาน และทำการ Minimize ให้ดูง่ายและสามารถนำไปใช้งานต่อได้เลย

import os
import subprocess
import multiprocessing

#ตามตัวอย่างจะมี Process ใน List อยู่ 3 โปรแกรม และให้รันพร้อมกันได้ 2 โปรแกรม

max_processes = 2
items = ['program1.py','program2.py','program3.py']


def process_function(item, retries=0):
try:
cmd = ['python', item]
process = subprocess.run(cmd, timeout=5000, capture_output=True, text=True, check=True)
print(f"Processed {item} successfully")
if 'Completed' not in process.stdout:
print(process.stdout)
return "success"
except subprocess.CalledProcessError:
if retries < 1:
print(f"Retrying {item}...")
return process_function(item, retries=retries + 1)
else:
print(f"Failed {item}")
return f"Error in {item}"
except Exception as e:
return f"Error in {item}: {e}"

def main():
with multiprocessing.Pool(processes=max_processes) as pool:
results = pool.starmap(process_function, [(item, 0) for item in items])

error_msg = ''.join(result for result in results if result != 'success')

print('ALL DONE')
if error_msg:
print("Error occurred:", error_msg)


if __name__ == "__main__":
main()

Scroll to Top