การเขียนโปรแกรมแบบอะซิงโครนัสเป็นมากกว่าปรัชญามากกว่าแค่กลอุบายอื่น ๆ ในขณะที่คำถามสุดท้ายของคุณดึงดูดคำตอบส่วนใหญ่เกี่ยวกับแง่มุมการเขียนโปรแกรมและคำตอบของฉันคือความไม่ฝักใฝ่ฝ่ายใดเพราะทฤษฎีส่วนใหญ่ฉันพยายามสร้างมุมมองใหม่ให้คุณในบรรทัดเดียวกัน แต่เป็นการอธิบายมากกว่าการอ้างอิง
อันนี้เป็นเรื่องพื้นฐานของสาเหตุและวิธีการเขียนโปรแกรมแบบอะซิงโครนัส
ลองสมมติว่าคุณไปร้านเบเกอรี่ (และสมมติว่าเค้กจะต้องเตรียมตามคำสั่ง) - คุณมีสองตัวเลือกคุณเลือกที่จะรอจนกว่าเค้กจะพร้อมหรือคุณให้คำสั่งและกลับบ้านและรับ ต่อมาเมื่อพร้อม คนแรก (รอ) เป็นวิธีการซิงโครและต่อมาเป็นวิธีการที่ไม่ตรงกัน จำเป็นต้องพูดตัวอย่างนี้ให้การอ้างอิงที่ดีว่าทำไมคุณควรใช้วิธีการแบบอะซิงโครนัสมากกว่าแบบซิงโครนัส
การเขียนโปรแกรมตามเหตุการณ์เป็นเพียงหนึ่งในวิธีที่ระบบอะซิงโครนัสสามารถสร้างขึ้นได้และไม่ได้เป็นเพียงรูปแบบการออกแบบที่มีประโยชน์ แต่เป็นรูปแบบสถาปัตยกรรม ฉันกำลังเขียนรายการกรณีที่ทฤษฎีนี้ใช้ในทางที่เป็นประโยชน์จริง ๆ - หวังว่ามันจะทำให้เกิดความชัดเจน
หนึ่งในตัวอย่างแรกของระบบอะซิงโครนัสคือระบบ Unix IO ในขณะที่เรารู้read()
, write()
และแม้กระทั่งselect()
เรียกบล็อกการไหลของโปรแกรม แต่ภายในระบบปฏิบัติการที่พวกเขาจะไม่ตรงกันเช่นเมล็ดโดยทั่วไปรู้ว่าอุปกรณ์ป้องกัน (ฮาร์ดดิสก์ aka) จะใช้เวลาในการบัฟเฟอร์เติมจน CPU เวลาดังกล่าวเป็นฟรี จากเธรดที่เกี่ยวข้องและด้วยเหตุนี้เธรดจะถูกจอดเป็น (ยังไม่พร้อม) อ้างอิง1. Moris Bach "การออกแบบระบบปฏิบัติการ Unix"
อีกตัวอย่างที่พบบ่อยที่สุดคือ UI Framework ส่วนใหญ่ นี่คือทั้งหมดที่ผู้ใช้คลิกถูกส่งผ่านตัวควบคุมแรกซึ่งในการเปิดการโทรหลังใช้งานที่เกี่ยวข้อง สิ่งสำคัญคือการโทรกลับไม่ควรรอให้โทรกลับอย่างอื่นระบบจะหยุด การโทรกลับจากคอนโทรลเลอร์ UI ไปจนถึงแบ็คเอนด์มักจะไม่ตรงกันหากเกี่ยวข้องกับการประมวลผลจำนวนมาก
อีกตัวอย่างที่ดีของการเขียนโปรแกรมแบบอะซิงโครนัส (เป็นรูปแบบการออกแบบบริสุทธิ์) คือวัตถุที่ใช้งาน วัตถุที่ใช้งานคือสิ่งที่มีเธรดส่วนตัวของตัวเองซึ่งสามารถเก็บคำขอจำนวนมากไว้ในคิวและดำเนินการทีละรายการ อ้างถึงกระดาษนี้: วัตถุที่ใช้งานอยู่ รูปแบบนี้มีการใช้งานอย่างหนักตั้งแต่ซอฟต์แวร์ Enterprise ไปจนถึงเฟรมเวิร์กมือถือ แพลตฟอร์มที่ได้รับความนิยมJava / EJBและ. NET อนุญาตให้ใช้การเรียกใช้เมธอดแบบอะซิงโครนัสท้องถิ่นหรือระยะไกลซึ่งทำให้วัตถุปกติกลายเป็นวัตถุที่ใช้งานเป็นหลัก วัตถุที่ใช้งานได้กลับมาอยู่ใน Symbian: วัตถุที่ใช้งานใน Symbian OS โดย Aapo Haapanen (ดูสิ่งนี้: วัตถุที่ใช้งานใน Symbian ) ตอนนี้ยังมีอยู่ในAndroid )
นอกเหนือจากวัตถุที่ใช้งานผู้เขียนคนเดียวกันดักลาสซี. ชมิดท์ได้ผลิตผลงานอื่น ๆ จำนวนมากซึ่งเป็นแนวอื่น ๆ ไปยังวัตถุที่ใช้งานและเป็นรูปแบบอะซิงโครนัส ดูเหตุการณ์นี้การจัดการรูปแบบและบัญชีเต็มมีอยู่ในหนังสือของเขาสถาปัตยกรรมซอฟต์แวร์เชิงรูปแบบ: รูปแบบสำหรับวัตถุที่เกิดขึ้นพร้อมกันและเครือข่าย - V2
เมื่อวัตถุที่กำหนดต้องส่งคืน API ในขณะที่ทำงานในพื้นหลังเพื่อให้งานสำเร็จจริง ๆ วิธีการตามปกติคือมีระบบแบบมัลติเธรดเพื่อให้ได้สิ่งนี้ ระบบเธรดมีอยู่ทุกที่ตั้งแต่ C (posix), C ++ ( บูสต์ ) ถึง Java, C # และอื่น ๆ วัตถุที่ใช้งานเป็นหลักเพียงนามธรรมซึ่งสามารถซ่อนสิ่งนี้ ดูว่าทำไมการใช้งานวัตถุที่ใช้งานจึงเป็นที่นิยมมากกว่ากระทู้เปล่า อีกอ่านที่ดี
แต่แนวคิดนี้เหนือกว่าเธรดหรือวัตถุภายในแอปพลิเคชันเพื่อให้เป็นแบบอะซิงโครนัส หนึ่งในการใช้งานที่ดีที่สุดคือในระบบแบบกระจายที่สองแอพพลิเคชั่นไม่จำเป็นต้องรอให้กันและกันประสานงานกัน ดีมาก (หรือไม่ดีนักไม่ว่าคุณจะมองทางไหน) RPCเป็นแบบซิงโครนัส [แน่นอนมีRPC แบบอะซิงโครนัสอื่น ๆเช่นกัน] แต่ทางเลือกที่ทันสมัยเช่นMessage Oriented Middlewareนั้นไม่ตรงกันอย่างแท้จริงด้วยเหตุผลที่ดี
แต่สุดท้ายอาจจะเป็นที่น่าสนใจมากที่สุดคนหนึ่งคือการเขียนโปรแกรมตัวแทนซึ่งสามารถได้รับประโยชน์จากรูปแบบของการสื่อสารไม่ตรงกัน
ในขณะที่การเขียนโปรแกรมแบบอะซิงโครนัสไม่ได้ดูเซ็กซี่แต่มันสร้างความซับซ้อนของตัวเองรวมถึง:
- กรอบสำหรับการส่งคืนค่า
- ค่าใช้จ่ายในการสื่อสารเพิ่มเติม
- ความต้องการเพิ่มเติมสำหรับการซิงโครไนซ์โครงสร้าง
- ความเป็นไปได้ของการหยุดชะงักการแข่งรถ ฯลฯ หากสิ่งไม่ถูกต้อง
... และต่อไป
ควรใช้ด้วยเหตุผลของแท้เท่านั้น
ดังนั้นเมื่อหนึ่งควรใช้แบบจำลองไม่ตรงกัน เมื่อใดที่คุณควรใส่เธรดพื้นหลังและอนุญาตให้ผู้โทรเข้าแบบอะซิงโครนัสนี่คือกฎบางอย่างที่ดีเมื่อใช้ (แต่ไม่สมบูรณ์)
เมื่อระบบต้องการใช้การสนทนาอย่างจริงจังกับทรัพยากร: ตัวอย่างเช่นคุณต้องการเก็บจำนวนเธรดที่แน่นอน รูปแบบอะซิงโครนัสบังคับให้ระบบใช้คิว
เมื่อผู้โทรจำเป็นต้องทำ"สิ่งที่มีประโยชน์อื่น ๆ ให้ทำ"เป็นของแท้แน่นอน หลายครั้งที่เธรดอื่น ๆ แม้ว่าจะทำการยกเลิกการปิดกั้นจะไม่ทำสิ่งใดที่มีประโยชน์และหยุดการทำโพลเพื่อให้ได้ผลลัพธ์ นี่อาจเป็นการใช้ CPU มากกว่าแบบจำลองพื้นฐานแบบซิงโครนัส
เมื่อคุณต้องการระดับความน่าเชื่อถือที่สูงขึ้นในระบบกระจาย (ดูMiddleware ข้อความที่มุ่งเน้น )