30 มีนาคม 2558

Published มีนาคม 30, 2558 by with 0 comment

แนะนำ Multiprocessing ใน Python

สวัสดีผู้อ่านทุกท่านครับ บทความนี้จะพาผู้อ่านไปแนะนำการเขียนโปรแกรมโดยใช้ Multiprocessing ในภาษา Python กันครับ


ในงานบางงาน ต้องการการประมวลผลหลาย ๆ ในเวลาเดียวกัน หากเป็นการเขียนโปรแกรมตามปกติเราจะดำเนินงานได้แค่ครั้งละงานเดียวเท่านนั้น ทำให้เราต้องเขียนโปรแกรมโดยอาศัยการแยกโปรเซสของงานออกจากกัน เพื่อให้สามารถประมวลผลงานหลาย ๆ ในเวลาเดียวกัน ตัวอย่างโปรแกรมที่ใช้หลักการนี้มี โปรแกรมแชทต่าง ๆ และโปรแกรมดาวน์โหลดไฟล์ต่าง ๆ เป็นต้นครับ

ในการเขียนโปรแกรมภาษา Python เราสามารถทำงานนี้ได้โดยอาศัย Thread และแบ่งออกเป็น Threading และ Multithreading

อ่านเกี่ยวกับ Threading ได้ที่นี่ครับ

บทความนี้จะพูดถึงเรื่อง Multithreading เป็นการประมวลผลแบบขนาน โดยสามารถทำงานหลาย ๆ งานในเวลาเดียวกันได้ครับ แต่ต้องคำนึงถึงหน่วยความจำ การประมวลผล CPU และการเหลือพื้นที่หน่วยความจำ กับการคืนหน่วยความจำให้กับระบบปฏิบัติการด้วยนะครับ
ในการใช้งาน Multithreading ต้อง

import multiprocessing

เข้ามาทุกครั้งครับ

ตัวอย่างใช้งาน Multiprocessing ใน Python


from multiprocessing import Process
def hi(name):
  print('สวัสดีคุณ ', name)
  return
if __name__=='__main__':
  a1 = Process(target=hi, args=('บญช่วย',))
  a2 = Process(target=hi, args=('สมศรี',))
  a1.start()
  a2.start()
  a1.join()
  a2.join()

ผลลัพธ์
สวัสดีคุณ บญช่วย
สวัสดีคุณ สมศรี

จะเห็นได้ว่าโปรแกรมประมวลผลแบบขนานพร้อมกันทั้งสองคำสั่ง

อีกตัวอย่างหนึ่งครับ

from multiprocessing import Process

def run():
 print('ทำงาน :D')
 return

if __name__ == '__main__':
 jobs = []
 for i in range(5):
  p = Process(target=run)
  jobs.append(p)
 p.start()

ผลลัพธ์
ทำงาน :D
ทำงาน :D
ทำงาน :D
ทำงาน :D
ทำงาน :D

มีการลูปคำสั่ง 5 ครั้งในคำสั่ง for i in range(5): ครับ โดยตัวแปร p สั่งงานโดยประมวลผลแบบขนานโดยเรียกใช้ฟังก์ชั่น run และคำสั่ง p.start() เป็นการเริ่มต้นการประมวลผลแบบขนาน ส่วนตัวแปร jobs เป็นการเก็บค่าการทำงาน Process โดยสามารถดูได้โดยเพิ่มคำสั่ง print(jobs) ได้ โดยโค้ดจะเป็น

from multiprocessing import Process

def run():
 print('ทำงาน :D')
 return

if __name__ == '__main__':
 jobs = []
 for i in range(5):
  p = Process(target=run)
 jobs.append(p)
 p.start()
 print(jobs)

ผลลัพธ์
[<Process(Process-1, started)>]
[<Process(Process-1, started)>, <Process(Process-2, started)>]
[<Process(Process-1, started)>, <Process(Process-2, started)>, <Process(Process-3, started)>]
[<Process(Process-1, started)>, <Process(Process-2, started)>, <Process(Process-3, started)>, <Process(Process-4, started)>]
[<Process(Process-1, started)>, <Process(Process-2, started)>, <Process(Process-3, started)>, <Process(Process-4, started)>, <Process(Process-5, started)>]
ทำงาน :D
ทำงาน :D
ทำงาน :D
ทำงาน :D
ทำงาน :D

อ่านรายละอียดเพิ่มเติมได้ที่ https://docs.python.org/3/library/multiprocessing.html

ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)