การเรียนรู้การโปรแกรมแบบอะซิงโครนัส [ปิด]


21

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

มีหนังสือที่ครอบคลุม / แตกหักหรือแหล่งข้อมูลอื่น ๆ ในเรื่องนี้ (เช่นGoFสำหรับรูปแบบการออกแบบหรือK&Rสำหรับ C, tldpสำหรับสิ่งต่าง ๆ เช่นทุบตี)

(หมายเหตุ: ฉันไม่แน่ใจว่านี่เป็นคำถามที่ตรงกับคำถามของฉันในการเขียนโปรแกรมที่ขับเคลื่อนด้วยเหตุการณ์การเรียนรู้หรือไม่ )



เริ่มต้นด้วยฐานพื้นฐานที่สุด: en.wikipedia.org/wiki/Pi-calculus
SK-logic

คำตอบ:


35

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

อันนี้เป็นเรื่องพื้นฐานของสาเหตุและวิธีการเขียนโปรแกรมแบบอะซิงโครนัส

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

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

  1. หนึ่งในตัวอย่างแรกของระบบอะซิงโครนัสคือระบบ Unix IO ในขณะที่เรารู้read(), write()และแม้กระทั่งselect()เรียกบล็อกการไหลของโปรแกรม แต่ภายในระบบปฏิบัติการที่พวกเขาจะไม่ตรงกันเช่นเมล็ดโดยทั่วไปรู้ว่าอุปกรณ์ป้องกัน (ฮาร์ดดิสก์ aka) จะใช้เวลาในการบัฟเฟอร์เติมจน CPU เวลาดังกล่าวเป็นฟรี จากเธรดที่เกี่ยวข้องและด้วยเหตุนี้เธรดจะถูกจอดเป็น (ยังไม่พร้อม) อ้างอิง1. Moris Bach "การออกแบบระบบปฏิบัติการ Unix"

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

  3. อีกตัวอย่างที่ดีของการเขียนโปรแกรมแบบอะซิงโครนัส (เป็นรูปแบบการออกแบบบริสุทธิ์) คือวัตถุที่ใช้งาน วัตถุที่ใช้งานคือสิ่งที่มีเธรดส่วนตัวของตัวเองซึ่งสามารถเก็บคำขอจำนวนมากไว้ในคิวและดำเนินการทีละรายการ อ้างถึงกระดาษนี้: วัตถุที่ใช้งานอยู่ รูปแบบนี้มีการใช้งานอย่างหนักตั้งแต่ซอฟต์แวร์ Enterprise ไปจนถึงเฟรมเวิร์กมือถือ แพลตฟอร์มที่ได้รับความนิยมJava / EJBและ. NET อนุญาตให้ใช้การเรียกใช้เมธอดแบบอะซิงโครนัสท้องถิ่นหรือระยะไกลซึ่งทำให้วัตถุปกติกลายเป็นวัตถุที่ใช้งานเป็นหลัก วัตถุที่ใช้งานได้กลับมาอยู่ใน Symbian: วัตถุที่ใช้งานใน Symbian OS โดย Aapo Haapanen (ดูสิ่งนี้: วัตถุที่ใช้งานใน Symbian ) ตอนนี้ยังมีอยู่ในAndroid )

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

  5. เมื่อวัตถุที่กำหนดต้องส่งคืน API ในขณะที่ทำงานในพื้นหลังเพื่อให้งานสำเร็จจริง ๆ วิธีการตามปกติคือมีระบบแบบมัลติเธรดเพื่อให้ได้สิ่งนี้ ระบบเธรดมีอยู่ทุกที่ตั้งแต่ C (posix), C ++ ( บูสต์ ) ถึง Java, C # และอื่น ๆ วัตถุที่ใช้งานเป็นหลักเพียงนามธรรมซึ่งสามารถซ่อนสิ่งนี้ ดูว่าทำไมการใช้งานวัตถุที่ใช้งานจึงเป็นที่นิยมมากกว่ากระทู้เปล่า อีกอ่านที่ดี

  6. แต่แนวคิดนี้เหนือกว่าเธรดหรือวัตถุภายในแอปพลิเคชันเพื่อให้เป็นแบบอะซิงโครนัส หนึ่งในการใช้งานที่ดีที่สุดคือในระบบแบบกระจายที่สองแอพพลิเคชั่นไม่จำเป็นต้องรอให้กันและกันประสานงานกัน ดีมาก (หรือไม่ดีนักไม่ว่าคุณจะมองทางไหน) RPCเป็นแบบซิงโครนัส [แน่นอนมีRPC แบบอะซิงโครนัสอื่น ๆเช่นกัน] แต่ทางเลือกที่ทันสมัยเช่นMessage Oriented Middlewareนั้นไม่ตรงกันอย่างแท้จริงด้วยเหตุผลที่ดี

  7. แต่สุดท้ายอาจจะเป็นที่น่าสนใจมากที่สุดคนหนึ่งคือการเขียนโปรแกรมตัวแทนซึ่งสามารถได้รับประโยชน์จากรูปแบบของการสื่อสารไม่ตรงกัน


ในขณะที่การเขียนโปรแกรมแบบอะซิงโครนัสไม่ได้ดูเซ็กซี่แต่มันสร้างความซับซ้อนของตัวเองรวมถึง:

  • กรอบสำหรับการส่งคืนค่า
  • ค่าใช้จ่ายในการสื่อสารเพิ่มเติม
  • ความต้องการเพิ่มเติมสำหรับการซิงโครไนซ์โครงสร้าง
  • ความเป็นไปได้ของการหยุดชะงักการแข่งรถ ฯลฯ หากสิ่งไม่ถูกต้อง

... และต่อไป

ควรใช้ด้วยเหตุผลของแท้เท่านั้น

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

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

  2. เมื่อผู้โทรจำเป็นต้องทำ"สิ่งที่มีประโยชน์อื่น ๆ ให้ทำ"เป็นของแท้แน่นอน หลายครั้งที่เธรดอื่น ๆ แม้ว่าจะทำการยกเลิกการปิดกั้นจะไม่ทำสิ่งใดที่มีประโยชน์และหยุดการทำโพลเพื่อให้ได้ผลลัพธ์ นี่อาจเป็นการใช้ CPU มากกว่าแบบจำลองพื้นฐานแบบซิงโครนัส

  3. เมื่อคุณต้องการระดับความน่าเชื่อถือที่สูงขึ้นในระบบกระจาย (ดูMiddleware ข้อความที่มุ่งเน้น )


ลิงก์ POSA นั้นตายแล้ว - web.archive.org/web/20170724063431/https://www.cse.wustl.edu/…ยังใช้งานได้
Élektra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.