Python Multiprocessing For-Loop

Python Multiprocessing For Loop



การประมวลผลหลายตัวเทียบได้กับมัลติเธรด อย่างไรก็ตาม มีความแตกต่างตรงที่เราสามารถรันเธรดได้ครั้งละหนึ่งเธรดเท่านั้นเนื่องจาก GIL ที่ใช้สำหรับการเธรด การประมวลผลหลายตัวคือกระบวนการดำเนินการตามลำดับใน CPU หลายคอร์ ไม่สามารถดำเนินการเธรดแบบขนานได้ อย่างไรก็ตาม การประมวลผลหลายตัวทำให้เราสามารถสร้างกระบวนการและเรียกใช้พร้อมกันบนแกน CPU ต่างๆ การวนซ้ำ เช่น for-loop เป็นหนึ่งในภาษาสคริปต์ที่ใช้บ่อยที่สุด ทำซ้ำงานเดิมโดยใช้ข้อมูลต่างๆ จนกว่าจะถึงเกณฑ์ เช่น จำนวนการวนซ้ำที่กำหนดไว้ล่วงหน้า การวนซ้ำจะทำการวนซ้ำแต่ละครั้งให้สำเร็จ

ตัวอย่างที่ 1: การใช้ For-Loop ใน Python Multiprocessing Module

ในตัวอย่างนี้ เราใช้ for-loop และ Python multiprocessing module class process เราเริ่มต้นด้วยตัวอย่างที่ตรงไปตรงมามาก เพื่อให้คุณเข้าใจได้อย่างรวดเร็วว่า Python multiprocessing for-loop ทำงานอย่างไร การใช้อินเทอร์เฟซซึ่งเปรียบได้กับโมดูลเธรด การประมวลผลหลายชุดบรรจุการสร้างกระบวนการ







ด้วยการใช้กระบวนการย่อยแทนที่จะเป็นเธรด แพ็คเกจการประมวลผลหลายตัวมีทั้งการทำงานพร้อมกันภายในเครื่องและระยะไกล ดังนั้นจึงหลีกเลี่ยง Global Interpreter Lock ใช้ for-loop ซึ่งอาจเป็นวัตถุสตริงหรือทูเพิล เพื่อวนซ้ำตามลำดับอย่างต่อเนื่อง ซึ่งทำงานน้อยกว่าคีย์เวิร์ดที่พบในภาษาโปรแกรมอื่นๆ และเหมือนกับวิธีการวนซ้ำที่พบในภาษาโปรแกรมอื่นๆ เมื่อเริ่มต้นการประมวลผลหลายตัวใหม่ คุณสามารถเรียกใช้ for-loop ที่ดำเนินการตามขั้นตอนพร้อมกันได้



เรามาเริ่มกันที่การนำโค้ดไปใช้ในการรันโค้ดโดยใช้เครื่องมือ “สปายเดอร์” เราเชื่อว่า “สปายเดอร์” นั้นดีที่สุดสำหรับการเรียกใช้ Python เรานำเข้ากระบวนการของโมดูลมัลติโพรเซสซิงที่โค้ดกำลังทำงานอยู่ แนวคิดของการประมวลผลหลายตัวใน Python เรียกว่า 'คลาสกระบวนการ' สร้างกระบวนการ Python ใหม่ ให้วิธีการเรียกใช้โค้ด และให้แอปพลิเคชันหลักจัดการการดำเนินการ คลาส Process มีขั้นตอน start() และ join() ซึ่งทั้งสองอย่างนี้มีความสำคัญ



ต่อไป เรากำหนดฟังก์ชันที่ผู้ใช้กำหนดชื่อ 'func' เนื่องจากเป็นฟังก์ชันที่ผู้ใช้กำหนด เราจึงตั้งชื่อให้ตามต้องการ ภายในเนื้อความของฟังก์ชันนี้ เราส่งตัวแปร 'หัวเรื่อง' เป็นอาร์กิวเมนต์และค่า 'คณิตศาสตร์' ต่อไป เราเรียกฟังก์ชัน “print()” โดยส่งคำสั่ง “The name of the common subject is” เช่นเดียวกับอาร์กิวเมนต์ “subject” ซึ่งมีค่า จากนั้น ในขั้นตอนต่อไปนี้ เราใช้ “if name== _main_” ซึ่งจะป้องกันไม่ให้คุณเรียกใช้โค้ดเมื่อไฟล์ถูกนำเข้าเป็นโมดูล และจะอนุญาตให้คุณทำเช่นนั้นได้เฉพาะเมื่อเนื้อหาถูกดำเนินการเป็นสคริปต์เท่านั้น





ส่วนเงื่อนไขที่คุณเริ่มต้นอาจถูกมองว่าเป็นตำแหน่งที่ตั้งเพื่อจัดเตรียมเนื้อหาที่ควรจะดำเนินการเมื่อไฟล์ของคุณทำงานเป็นสคริปต์เท่านั้น จากนั้น เราใช้หัวข้ออาร์กิวเมนต์และเก็บค่าบางอย่างไว้ในนั้น ซึ่งได้แก่ 'วิทยาศาสตร์' 'ภาษาอังกฤษ' และ 'คอมพิวเตอร์' กระบวนการจะได้รับการตั้งชื่อว่า “process1[]” ในขั้นตอนต่อไปนี้ จากนั้น เราใช้ “กระบวนการ(เป้าหมาย=func)” เพื่อเรียกใช้ฟังก์ชันในกระบวนการ Target ใช้เพื่อเรียกใช้ฟังก์ชัน และเราบันทึกกระบวนการนี้ไว้ในตัวแปร 'P'

ต่อไป เราใช้ “process1” เพื่อเรียกใช้ฟังก์ชัน “append()” ซึ่งเพิ่มรายการต่อท้ายรายการที่เรามีในฟังก์ชัน “func” เนื่องจากกระบวนการถูกเก็บไว้ในตัวแปร 'P' เราจึงส่ง 'P' ไปยังฟังก์ชันนี้เป็นอาร์กิวเมนต์ สุดท้าย เราใช้ฟังก์ชัน “start()” กับ “P” เพื่อเริ่มกระบวนการ หลังจากนั้น เรารันเมธอดอีกครั้งโดยระบุอาร์กิวเมนต์ 'subject' และใช้ 'for' ใน subject จากนั้นใช้เมธอด “process1” และ “add()” อีกครั้ง เพื่อเริ่มต้นกระบวนการ กระบวนการจะทำงานและผลลัพธ์จะถูกส่งกลับ ขั้นตอนจะถูกบอกให้สิ้นสุดโดยใช้เทคนิค “join()” กระบวนการที่ไม่เรียกโพรซีเดอร์ “join()” จะไม่ออก จุดสำคัญประการหนึ่งคือต้องใช้พารามิเตอร์คำหลัก 'args' หากคุณต้องการระบุอาร์กิวเมนต์ใดๆ ตลอดกระบวนการ




ตอนนี้ คุณสามารถดูผลลัพธ์ได้ว่าคำสั่งแสดงขึ้นก่อนโดยส่งค่าสำหรับหัวเรื่อง 'คณิตศาสตร์' ที่เราส่งผ่านไปยังฟังก์ชัน 'func' เพราะเราเรียกมันก่อนโดยใช้ฟังก์ชัน 'กระบวนการ' จากนั้น เราใช้คำสั่ง “append()” เพื่อให้มีค่าที่มีอยู่แล้วในรายการซึ่งเพิ่มเข้ามาที่ส่วนท้าย จากนั้นนำเสนอ “วิทยาศาสตร์” “คอมพิวเตอร์” และ “ภาษาอังกฤษ” แต่อย่างที่คุณเห็น ค่าไม่ได้อยู่ในลำดับที่ถูกต้อง นี่เป็นเพราะพวกเขาทำทันทีที่ขั้นตอนเสร็จสิ้นและรายงานข้อความของพวกเขา

ตัวอย่างที่ 2: การแปลง Sequential For-Loop เป็น Multiprocessing Parallel For-Loop

ในตัวอย่างนี้ งานลูปการประมวลผลหลายตัวจะถูกดำเนินการตามลำดับก่อนที่จะถูกแปลงเป็นงาน for-loop แบบขนาน คุณสามารถวนผ่านลำดับต่างๆ เช่น คอลเล็กชันหรือสตริงตามลำดับที่เกิดขึ้นโดยใช้ for-loop

ตอนนี้เรามาเริ่มใช้โค้ดกัน ก่อนอื่น เรานำเข้า 'โหมดสลีป' จากโมดูลเวลา การใช้ขั้นตอน “sleep()” ในโมดูลเวลา คุณสามารถระงับการดำเนินการของเธรดการโทรได้นานเท่าที่คุณต้องการ จากนั้น เราใช้ 'สุ่ม' จากโมดูลสุ่ม กำหนดฟังก์ชันด้วยชื่อ 'func' และส่งคีย์เวิร์ด 'argu' จากนั้น เราสร้างค่าสุ่มโดยใช้ 'val' และตั้งค่าเป็น 'สุ่ม' จากนั้น เราบล็อกช่วงเวลาเล็กน้อยโดยใช้เมธอด “sleep()” และส่ง “val” เป็นพารามิเตอร์ จากนั้น ในการส่งข้อความ เรารันเมธอด “print()” โดยส่งคำว่า “ready” และคีย์เวิร์ด “arg” เป็นพารามิเตอร์ เช่นเดียวกับ “created” และส่งผ่านค่าโดยใช้ “val”

สุดท้าย เราใช้ 'flush' และตั้งค่าเป็น 'True' ผู้ใช้สามารถตัดสินใจว่าจะบัฟเฟอร์เอาต์พุตหรือไม่โดยใช้ตัวเลือก flush ในฟังก์ชันการพิมพ์ของ Python ค่าเริ่มต้นของพารามิเตอร์นี้เป็น False บ่งชี้ว่าเอาต์พุตจะไม่ถูกบัฟเฟอร์ เอาต์พุตจะแสดงเป็นชุดของบรรทัดที่ต่อกัน หากคุณตั้งค่าเป็น True จากนั้น เราใช้ “if name== main” เพื่อรักษาความปลอดภัยจุดเข้า ต่อไป เราดำเนินงานตามลำดับ ที่นี่ เราตั้งค่าช่วงเป็น '10' ซึ่งหมายความว่าการวนซ้ำจะสิ้นสุดลงหลังจากการวนซ้ำ 10 ครั้ง ต่อไป เราเรียกฟังก์ชัน “print()” ส่งคำสั่งอินพุต “พร้อม” และใช้ตัวเลือก “flush=True”


คุณจะเห็นได้ว่าเมื่อเรารันโค้ด การวนซ้ำจะทำให้ฟังก์ชันทำงาน “10” ครั้ง วนซ้ำเป็น 10 ครั้ง เริ่มต้นที่ดัชนีศูนย์และสิ้นสุดที่ดัชนีเก้า ทุกข้อความมีหมายเลขงานซึ่งเป็นหมายเลขฟังก์ชันที่เราส่งผ่านเป็น 'arg' และหมายเลขการสร้าง


การวนซ้ำตามลำดับนี้กำลังถูกแปลงเป็น for-loop แบบขนานสำหรับการประมวลผลหลายตัว เราใช้รหัสเดียวกัน แต่เรากำลังไปที่ไลบรารีและฟังก์ชันเพิ่มเติมสำหรับการประมวลผลหลายตัว ดังนั้น เราต้องนำเข้ากระบวนการจากการประมวลผลหลายตัว ดังที่เราได้อธิบายไว้ก่อนหน้านี้ ต่อไป เราสร้างฟังก์ชันชื่อ 'func' และส่งคีย์เวิร์ด 'arg' ก่อนใช้ 'val=random' เพื่อรับตัวเลขสุ่ม

จากนั้น หลังจากเรียกใช้เมธอด “print()” เพื่อแสดงข้อความและให้พารามิเตอร์ “val” เพื่อหน่วงเวลาเล็กน้อย เราใช้ฟังก์ชัน “if name= main” เพื่อรักษาความปลอดภัยจุดเข้าใช้งาน จากนั้น เราสร้างกระบวนการและเรียกใช้ฟังก์ชันในกระบวนการโดยใช้ 'กระบวนการ' และส่ง 'target=func' จากนั้น เราส่งผ่าน “func”, “arg”, ส่งค่า “m” และผ่านช่วง “10” ซึ่งหมายความว่าลูปจะยุติฟังก์ชันหลังจากการวนซ้ำ “10” จากนั้น เราเริ่มกระบวนการโดยใช้เมธอด “start()” ด้วย “กระบวนการ” จากนั้นเราเรียกเมธอด “join()” เพื่อรอการดำเนินการของกระบวนการและดำเนินการทั้งหมดให้เสร็จสิ้นหลังจากนั้น


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

บทสรุป

เราได้กล่าวถึงการประมวลผลหลายตัวของ Python สำหรับลูปในบทความนี้ เรายังนำเสนอภาพประกอบ 2 ภาพ ภาพประกอบแรกแสดงวิธีใช้ for-loop ในไลบรารีการประมวลผลหลายตัวแบบวนซ้ำของ Python และภาพประกอบที่สองแสดงวิธีเปลี่ยน for-loop ตามลำดับเป็น for-loop การประมวลผลหลายตัวแบบขนาน ก่อนที่จะสร้างสคริปต์สำหรับการประมวลผลหลายตัวของ Python เราต้องนำเข้าโมดูลการประมวลผลหลายตัว