แพ็คเกจการประมวลผลหลายตัวรองรับกระบวนการวางไข่ หมายถึงฟังก์ชันที่โหลดและดำเนินการโปรเซสลูกใหม่ เพื่อให้ชายด์ยุติหรือดำเนินการประมวลผลพร้อมกันต่อไป กระบวนการปัจจุบันต้องรอโดยใช้ API ซึ่งคล้ายกับโมดูลเธรด
แนะนำตัว
เมื่อเราทำงานกับ Multiprocessing ขั้นแรกเราจะสร้างกระบวนการ วัตถุ. จากนั้นเรียกใช้เมธอด start()
โค้ดตัวอย่าง
from multiprocessing import Process def display(): print ('Hi !! I am Python') if __name__ == '__main__': p = Process(target=display) p.start() p.join()
ในตัวอย่างนี้ ขั้นแรก เรานำเข้าคลาส Process จากนั้นเริ่มอ็อบเจ็กต์ Process ด้วยฟังก์ชัน display()
จากนั้นโปรเซสจะเริ่มต้นด้วยเมธอด start() และจากนั้นทำกระบวนการให้เสร็จสิ้นด้วยเมธอด join()
นอกจากนี้เรายังสามารถส่งอาร์กิวเมนต์ไปยังฟังก์ชันได้โดยใช้คีย์เวิร์ด args
ตัวอย่าง
from multiprocessing import Process def display(my_name): print ('Hi !!!' + " " + my_name) if __name__ == '__main__': p = Process(target=display, args=('Python',)) p.start() p.join()
ในตัวอย่างนี้ เราสร้างกระบวนการที่คำนวณลูกบาศก์ของตัวเลขและพิมพ์ผลลัพธ์ทั้งหมดไปยังคอนโซล
โค้ดตัวอย่าง
from multiprocessing import Process def cube(x): for x in my_numbers: print('%s cube is %s' % (x, x**3)) if __name__ == '__main__': my_numbers = [3, 4, 5, 6, 7, 8] p = Process(target=cube, args=('x',)) p.start() p.join print ("Done")
ผลลัพธ์
Done 3 cube is 27 4 cube is 64 5 cube is 125 6 cube is 216 7 cube is 343 8 cube is 512
นอกจากนี้เรายังสามารถสร้างกระบวนการได้มากกว่าหนึ่งขั้นตอนในแต่ละครั้ง
ในตัวอย่างนี้ ในตอนแรก เราสร้างกระบวนการหนึ่งซึ่งก็คือ process1 กระบวนการนี้เพียงแค่คำนวณลูกบาศก์ของตัวเลข และในขณะเดียวกัน กระบวนการที่สอง process2 กำลังตรวจสอบว่าตัวเลขนี้เป็นเลขคู่หรือคี่
ตัวอย่าง
from multiprocessing import Process def cube(x): for x in my_numbers: print('%s cube is %s' % (x, x**3)) def evenno(x): for x in my_numbers: if x % 2 == 0: print('%s is an even number ' % (x)) if __name__ == '__main__': my_numbers = [3, 4, 5, 6, 7, 8] my_process1 = Process(target=cube, args=('x',)) my_process2 = Process(target=evenno, args=('x',)) my_process1.start() my_process2.start() my_process1.join() my_process2.join() print ("Done")
ผลลัพธ์
3 cube is 27 4 cube is 64 5 cube is 125 6 cube is 216 7 cube is 343 8 cube is 512 4 is an even number 6 is an even number 8 is an even number Done
การสื่อสารระหว่างกระบวนการ
การประมวลผลหลายตัวรองรับ Pipes and Queues ซึ่งเป็นช่องทางการสื่อสารสองประเภทระหว่างกระบวนการ
ท่อ
ในการประมวลผลหลายตัว เมื่อเราต้องการสื่อสารระหว่างกระบวนการ ในสถานการณ์นั้น ท่อ ถูกนำมาใช้
ตัวอย่าง
from multiprocessing import Process, Pipe def myfunction(conn): conn.send(['hi!! I am Python']) conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() p = Process(target=myfunction, args=(child_conn,)) p.start() print (parent_conn.recv() ) p.join()
ผลลัพธ์
['hi !!! I am Python']
ท่อส่งกลับวัตถุเชื่อมต่อสองชิ้นและสิ่งเหล่านี้เป็นตัวแทนของปลายทั้งสองของท่อ แต่ละอ็อบเจ็กต์การเชื่อมต่อมีสองวิธีที่หนึ่งคือ send() และอีกวิธีหนึ่งคือ recv() วิธีการ
ในตัวอย่างนี้ ขั้นแรก เราสร้างกระบวนการและกระบวนการนี้จะพิมพ์ข้อความ "สวัสดี!! ฉันคือ Python" จากนั้นจึงแชร์ข้อมูลไปทั่ว
คิว
เมื่อเราส่งข้อมูลระหว่างกระบวนการ ณ เวลานั้น เราก็สามารถใช้ Queue object ได้
ตัวอย่าง
import multiprocessing def evenno(numbers, q): for n in numbers: if n % 2 == 0: q.put(n) if __name__ == "__main__": q = multiprocessing.Queue() p = multiprocessing.Process(target=evenno, args=(range(10), q)) p.start() p.join() while q: print(q.get())
ผลลัพธ์
0 2 4 6 8
ในตัวอย่างนี้ ขั้นแรกให้สร้างฟังก์ชันที่ตรวจสอบสภาพอากาศว่าตัวเลขเป็นเลขคู่หรือไม่ หากตัวเลขเป็นเลขคู่ ให้ใส่ที่ท้ายคิว จากนั้นเราสร้างวัตถุคิวและวัตถุกระบวนการ จากนั้นเราเริ่มกระบวนการ
และสุดท้ายตรวจสอบว่าคิวว่างหรือไม่
เมื่อเราพิมพ์ตัวเลข ตอนแรกเราจะพิมพ์ค่าที่อยู่ข้างหน้าคิวแล้วตามด้วยค่าถัดไปเป็นต้น
ล็อค
เมื่อเราต้องการให้มีการดำเนินการเพียงครั้งเดียวในสถานการณ์นั้น Locks จะถูกใช้งาน นั่นหมายความว่าเวลาบล็อกกระบวนการอื่นจากการรันโค้ดที่คล้ายกัน การล็อกจะถูกปล่อยหลังจากกระบวนการเสร็จสิ้น
ตัวอย่างการใช้วิธีการล็อก
ตัวอย่าง
from multiprocessing import Process, Lock def dispmay_name(l, i): l.acquire() print ('Hi', i) l.release() if __name__ == '__main__': my_lock = Lock() my_name = ['Aadrika', 'Adwaita', 'Sakya', 'Sanj'] for name in my_name: Process(target=dispmay_name, args=(my_lock,name)).start()
ผลลัพธ์
Hi Aadrika Hi Adwaita Hi Sakya Hi Sanj
การบันทึก
โมดูลการประมวลผลหลายตัวยังมีโมดูลการบันทึกเพื่อให้แน่ใจว่าหากแพ็คเกจการบันทึกไม่ได้ใช้ฟังก์ชั่นล็อค ข้อความระหว่างกระบวนการจะปะปนกันระหว่างการดำเนินการ
ตัวอย่าง
import multiprocessing, logging logger = multiprocessing.log_to_stderr() logger.setLevel(logging.INFO) logger.warning('Error has occurred')
ในตัวอย่างนี้ ในตอนแรก เรานำเข้าโมดูลการบันทึกและการประมวลผลหลายตัว จากนั้นเราจะใช้วิธี multiprocessing.log_to_stderr() และเรียก get_logger() รวมทั้งเพิ่มใน sys.stderr และสุดท้ายเรากำหนดระดับของตัวบันทึกและถ่ายทอดข้อความ