อะไรจะเป็นวิธีที่ดีที่สุดในการจัดการข้อผิดพลาดในโปรแกรมแบบขนาน?


11

ด้วยอัลกอริทึมแบบขนานที่เคาะประตูมันอาจเป็นเวลาที่ดีที่จะคิดเกี่ยวกับการจัดการข้อผิดพลาด

ดังนั้นในตอนแรกจึงมีรหัสข้อผิดพลาด เหล่านั้นดูด มีอิสระที่จะเพิกเฉยต่อพวกเขาดังนั้นคุณอาจล้มเหลวช้าและสร้างรหัสที่ยากต่อการดีบัก

จากนั้นก็มีข้อยกเว้น สิ่งเหล่านี้ทำให้ไม่สามารถเพิกเฉยได้เมื่อเกิดขึ้นและคนส่วนใหญ่ (ยกเว้น Joel) ชอบพวกเขาดีกว่า

และตอนนี้เรามีห้องสมุดที่ช่วยให้โค้ดคู่ขนาน ปัญหาคือคุณไม่สามารถจัดการกับข้อยกเว้นในรหัสขนานได้อย่างง่ายดายเท่าที่จะทำได้กับรหัสที่ไม่ขนานกัน หากคุณเริ่มงานแบบอะซิงโครนัสและส่งข้อยกเว้นจะไม่มีการติดตามสแต็กที่ผ่านมาเพื่อคลายออก ดีที่สุดที่คุณสามารถทำได้คือจับมันและลงทะเบียนบนวัตถุงานหากมีวัตถุดังกล่าว อย่างไรก็ตามมันจะเอาชนะจุดแข็งหลักของข้อยกเว้น: คุณต้องตรวจสอบพวกมันและคุณสามารถเพิกเฉยได้โดยไม่ต้องใช้ความพยายามเพิ่มเติมในขณะที่โค้ดแบบเธรดเดียวข้อยกเว้นจะทำให้เกิดการกระทำที่เหมาะสม

การใช้ภาษาหรือไลบรารีควรสนับสนุนข้อผิดพลาดในรหัสคู่ขนานอย่างไร


2
สิ่งนี้ไม่ควรเป็นของstackoverflowหรือ
Graviton

@ Ngu Soon Hui เป็นอัตนัยและเป็นเรื่องเกี่ยวกับคุณสมบัติที่ไม่จำเป็นดังนั้นฉันคิดว่ามันเป็นของที่นี่
zneak

แต่มันเกี่ยวกับการเขียนโปรแกรมไม่ใช่โปรแกรมเมอร์ :)
bzlm

1
@bzlm คำถามที่พบบ่อยพูดว่า "โปรแกรมเมอร์ - กองแลกเปลี่ยนสำหรับโปรแกรมเมอร์ผู้เชี่ยวชาญที่มีความสนใจในการอภิปรายเกี่ยวกับการพัฒนาซอฟต์แวร์อัตนัย" และไม่สนับสนุนการสนทนาเชิงอัตวิสัย
zneak

คำตอบ:


2

ฉันชอบการเรียกกลับสำหรับข้อผิดพลาดที่สามารถจัดการได้ และพวกเขาสามารถทำงานได้ดีแบบอะซิงโครนัส ...

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


ฉันโทรกลับที่สอง ความคิดข้างต้นดูเหมือนจะสมบูรณ์แบบสำหรับฉัน
สันติภาพ Noctis

-2

ดูเหมือนว่าคุณต้องการให้แน่ใจว่างานที่จัดการนั้นเป็นข้อยกเว้นของตัวเองแล้วส่งคืนบางสิ่งที่ทำให้โปรแกรมเรียกทราบว่าเธรดที่จำเป็นต้องปิดตัวลง จากนั้นจะมีตรรกะในการประมวลผลผลลัพธ์ของเธรดทั้งหมดโดยที่รู้ว่าเธรดเหล่านั้นบางส่วนล้มเหลว


5
"คืนสิ่งที่" - เพื่อใคร ผู้โทรได้ย้ายไปแล้ว
Mark H

ตามที่ @ sparkie กล่าวว่าคุณไม่สามารถทำเช่นนั้นได้ แม้ว่าคุณจะเก็บ call call ไว้เป็นรูทของ coroutine แต่ผู้โทรอาจจะอยู่ไกล ที่ผมกล่าวถึงข้อยกเว้นได้รับการออกแบบเพื่อให้พวกเขาหยุดของคุณโปรแกรม , ในขณะนี้ การตรวจสอบด้วยตัวคุณเองในภายหลังจะเอาชนะได้อย่างสมบูรณ์โดยไม่มีข้อยกเว้น
zneak

@ Zneak ฉันคิดว่าเมื่อฉันพูดถึงข้อยกเว้นที่ฉันไม่ได้ใช้คำนิยาม (มาตรฐาน) ของคุณฉันแค่หมายถึงข้อผิดพลาดที่ถูกจับ หลังจากฟังก์ชั่นใด ๆ เสร็จสิ้นก็ต้องกลับไปที่อื่น ณ จุดนั้นข้อยกเว้น "/ ข้อผิดพลาดสามารถจัดการได้ (ที่ระดับนั้น) ฉันไม่แน่ใจว่าทำไมพวกคุณถึงหมายถึงโปรแกรมโทรที่อยู่ไกลค่าตอบแทนใด ๆ จากฟังก์ชั่นจะต้องได้รับการจัดการในบางครั้ง ฉันรู้ว่าสิ่งนี้จะใช้งานไม่ได้เช่นกันหากผลลัพธ์ของเธรดเชื่อมโยงกัน

1
ไม่ใช่งานที่ "ขนานกัน" ทั้งหมด ตัวอย่างเช่นคุณสามารถมอบหมายงานที่มีความยาวให้กับเธรดแยกต่างหากในขณะที่ทำอย่างอื่นบนเธรดหลัก (ไม่ถูกต้อง) โดยไม่ต้องสงสัยเลยว่ามันจะเสร็จสมบูรณ์อย่างถูกต้องหรือไม่ ตัวอย่างเช่นฉันสามารถเขียนซอฟต์แวร์รุ่นรูปภาพที่เขียนไปยังไฟล์จากเธรดรองและกลับจากไดอะล็อกบันทึกทันทีที่เริ่มงาน ฉันไม่ต้องการค่าตอบแทนไม่ว่าจะเป็นการดำเนินการใด ๆ เพิ่มเติมยกเว้นข้อผิดพลาดไม่มีเหตุผลที่จะตรวจสอบ
zneak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.