วิธีการสื่อสารความแตกต่างระหว่างการเขียนโปรแกรมไม่ตรงกันและขนาน?


139

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

ฉันเป็นโปรแกรมเมอร์ทำงานและใช้ async & callbacks ค่อนข้างบ่อย ความเท่าเทียมนั้นให้ความรู้สึกแปลกใหม่

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


ฉันเขียนบทความในบล็อกเกี่ยวกับความสัมพันธ์ระหว่างการเขียนโปรแกรมแบบอะซิงโครนัสและขนาน - anat-async.blogspot.com/2018/08/ …
Alexei Kaigorodov


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

คำตอบ:


87

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

ยกตัวอย่างเช่นเฟรมการเรนเดอร์ของภาพเคลื่อนไหว 3 มิติ ในการเรนเดอร์อนิเมชั่นใช้เวลานานดังนั้นหากคุณต้องเปิดตัวเรนเดอร์ตัวนั้นจากภายในซอฟต์แวร์แก้ไขอนิเมชั่นคุณต้องแน่ใจว่ามันทำงานแบบอะซิงโครนัสดังนั้นมันจะไม่ล็อค UI ของคุณ ขณะนี้แต่ละเฟรมของแอนิเมชันนั้นสามารถพิจารณาเป็นงานเดี่ยวได้ หากเรามี CPU / Cores หลายเครื่องหรือหลายเครื่องเราสามารถแสดงหลายเฟรมพร้อมกันเพื่อเพิ่มความเร็วให้กับปริมาณงานโดยรวม


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

1
"หากต้องการเรนเดอร์อนิเมชั่นใช้เวลานานดังนั้นหากคุณต้องการเปิดตัวเรนเดอร์ดังกล่าวจากภายในซอฟต์แวร์แก้ไขภาพเคลื่อนไหวของคุณคุณจะต้องแน่ใจ (... )" อะไร?

สำหรับส่วนของอนิเมชั่นสามมิติ: อย่างแรกเลยคุณจะไม่ต้องเรียกใช้โปรแกรมกราฟิกสามมิติที่มีการสร้างเฟรมบน CPU - บุคคลที่มีสติจะแนะนำให้ใช้ GPU ทันที ประการที่สองถ้าเราทำเช่นนี้ (ท้อแท้มาก) เราจะใช้ตัวจับเวลาเพื่อวัดจำนวนเฟรมที่เราสามารถเรนเดอร์มิฉะนั้นเราอาจจะจบลงด้วยการสร้างงานการเรนเดอร์ที่ยังไม่เสร็จ แต่ประเด็นของคุณใช้ได้อย่างสมบูรณ์แบบกับแอปพลิเคชั่นการเรนเดอร์ 2D ส่วนใหญ่ที่เรนเดอร์ตามการป้อนข้อมูลต่อผู้ใช้
ワイきんぐ

1
แบบอะซิงโครนัสและไม่มีการปิดกั้นเป็นกระบวนทัศน์ที่แตกต่างกัน
มาร์ควิสแห่ง Lorne

73

ผมเชื่อว่าความแตกต่างที่สำคัญคือระหว่างการทำงานพร้อมกันและเท่าเทียม

โดยทั่วไปAsyncและCallbacksเป็นวิธี (เครื่องมือหรือกลไก) เพื่อแสดงความพร้อมกันเช่นชุดของเอนทิตีที่อาจพูดคุยกันและแบ่งปันทรัพยากร ในกรณีของการสื่อสารแบบ async หรือ callback โดยปริยายในขณะที่ใช้ทรัพยากรร่วมกันเป็นทางเลือก (พิจารณา RMI โดยคำนวณผลลัพธ์ในเครื่องระยะไกล) ตามที่ระบุไว้อย่างถูกต้องสิ่งนี้มักกระทำโดยคำนึงถึงการตอบสนอง เพื่อไม่รอเหตุการณ์เวลาแฝงนาน

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

เพื่อให้เข้าใจถึงความแตกต่างระหว่างการเกิดพร้อมกันและความเท่าเทียมฉันจะอ้างอิงจากแบบจำลองความน่าจะเป็นสำหรับการเกิดพร้อมกันของ Daniele Varacca ซึ่งเป็นชุดที่ดีของบันทึกสำหรับทฤษฎีของการเกิดพร้อมกัน:

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

สรุปแล้วการเขียนโปรแกรมแบบขนานเป็นกรณีพิเศษของการทำงานพร้อมกันที่หน่วยงานแยกร่วมมือกันเพื่อให้ได้ประสิทธิภาพสูงและปริมาณงาน (โดยทั่วไป)

Async และ Callbacks เป็นเพียงกลไกที่อนุญาตให้โปรแกรมเมอร์แสดงการทำงานพร้อมกัน พิจารณาว่ารูปแบบการออกแบบการเขียนโปรแกรมแบบขนานที่รู้จักกันดีเช่นต้นแบบ / ผู้ปฏิบัติงานหรือแผนที่ / ย่อถูกนำมาใช้โดยกรอบงานที่ใช้กลไกระดับล่าง (async) เพื่อใช้การโต้ตอบที่ซับซ้อนมากขึ้น


37

บทความนี้อธิบายได้อย่างดี: http://urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming

มันมีสิ่งนี้เกี่ยวกับการเขียนโปรแกรมแบบอะซิงโครนัส:

การโทรแบบอะซิงโครนัสถูกใช้เพื่อป้องกัน "การบล็อก" ภายในแอปพลิเคชัน [เช่น a] การโทรจะแยกออกในเธรดที่มีอยู่แล้ว (เช่นเธรด I / O) และทำงานของมันเมื่อทำได้

เกี่ยวกับการเขียนโปรแกรมแบบขนาน:

ในการเขียนโปรแกรมแบบขนานคุณยังคงเลิกงานหรืองาน แต่ความแตกต่างที่สำคัญคือคุณหมุนหัวข้อใหม่สำหรับแต่ละชิ้นงาน

และสิ่งนี้โดยสรุป:

โทรไม่ตรงกันจะใช้หัวข้อการใช้งานแล้วโดยระบบและการเขียนโปรแกรมแบบขนานต้องใช้นักพัฒนาที่จะทำลายการทำงานขึ้นหัวข้อ SpinUp และลบล้างความจำเป็น


3
บทความนี้> คำตอบทั้งหมดที่นี่ (ยกเว้นหนึ่งในหลักสูตรนี้!)
FellyTone84

1
ขอบคุณสำหรับลิงค์ ดังนั้น ... โดยทั่วไปให้ใช้การโทร async เมื่อสื่อสารจาก UI ไปยังเซิร์ฟเวอร์ (หรือจากไคลเอนต์ไปยังบริการเว็บ) ใช้เธรดแบบขนานบนเซิร์ฟเวอร์หรือบริการบนเว็บเช่นเดียวกับในชั้นธุรกิจของคุณ
goku_da_master

18

ความเข้าใจพื้นฐานของฉันคือ

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

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

มันอาจซับซ้อนกว่านั้น แต่ฉันคิดว่านั่นคือความแตกต่างพื้นฐาน


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

13

ฉันมักจะคิดถึงความแตกต่างของคำเหล่านี้:

อะซิงโครนัส: หายไปและทำภารกิจนี้เมื่อคุณกลับมาแล้วบอกฉันและนำผลลัพธ์มาให้ ฉันจะไปกับสิ่งอื่น ๆ ในเวลาเฉลี่ย

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

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


13

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

ป้อนคำอธิบายรูปภาพที่นี่

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

ป้อนคำอธิบายรูปภาพที่นี่

ความแตกต่างที่สำคัญคือการขนานส่วนใหญ่ขึ้นอยู่กับฮาร์ดแวร์


11

มันเป็นคำถามของคำสั่งของการดำเนินการ

ถ้า A เป็นแบบอะซิงโครนัสกับ B ดังนั้นฉันไม่สามารถทำนายล่วงหน้าได้เมื่อส่วนย่อยของ A จะเกิดขึ้นตามส่วนย่อยของ B.

หาก A ขนานกับ B สิ่งต่าง ๆ ใน A จะเกิดขึ้นในเวลาเดียวกันกับสิ่งต่าง ๆ ใน B อย่างไรก็ตามอาจยังคงมีคำสั่งของการดำเนินการ

บางทีความยากลำบากก็คือคำอะซิงโครนัสนั้นไม่ชัดเจน

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

ทีมแม่บ้านของฉันทำงานในแบบคู่ขนานเมื่อแต่ละคนกำลังล้างหน้าต่างที่แตกต่างกัน

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

ทีมฟุตบอล (aka soccer) ของฉันทำงานคู่ขนานเนื่องจากผู้เล่นแต่ละคนประมวลผลข้อมูลเกี่ยวกับสนามอย่างอิสระและดำเนินการกับมัน แต่พวกเขาไม่พร้อมกันอย่างสมบูรณ์เพราะพวกเขาต้องสื่อสารและตอบสนองต่อการสื่อสารของผู้อื่น

วงโยธวาทิตของฉันก็ขนานกันเช่นกันเมื่อผู้เล่นแต่ละคนอ่านเพลงและควบคุมเครื่องดนตรีของพวกเขา แต่พวกเขาก็มีความพร้อมกันสูงพวกเขาเล่นและเดินขบวนกัน

ปืน gatling cammed ถือได้ว่าขนานกัน แต่ทุกอย่างเป็นแบบซิงโครนัส 100% ดังนั้นราวกับว่ากระบวนการหนึ่งกำลังก้าวไปข้างหน้า


9

ทำไมต้องแบบอะซิงโครนัส?

ด้วยแอพพลิเคชั่นในปัจจุบันที่มีการเชื่อมต่อมากขึ้นเรื่อย ๆ และอาจมีการใช้งานที่ยาวนานหรือการปิดกั้นการทำงานเช่น Network I / O หรือการดำเนินการฐานข้อมูลดังนั้นจึงเป็นเรื่องสำคัญอย่างยิ่งที่จะต้องซ่อนเวลาแฝง เร็วที่สุด อะซิงโครนัสมาที่รูปภาพการตอบสนองตอบสนอง

ทำไมการเขียนโปรแกรมแบบขนาน?

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


5

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

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

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


4

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

งานแบบขนาน: แต่ละงานจะทำงานแบบขนาน ไม่ใช้การสลับบริบท / การกำหนดเวลา


4

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

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

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

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

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

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

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

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

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


2

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

จากระดับสูงเช่นเซิร์ฟเวอร์ยอดนิยมNGINXและห้องสมุดPython Tornado ที่มีชื่อเสียงพวกเขาทั้งสองใช้กระบวนทัศน์แบบอะซิงโครนัสอย่างเต็มที่ซึ่งเป็นเซิร์ฟเวอร์เธรดเดี่ยวสามารถให้บริการลูกค้าได้หลายพันคนพร้อมกัน (บางIOloopและโทรกลับ ) การใช้ECF (การควบคุมการยกเว้นตาม) ซึ่งสามารถใช้กระบวนทัศน์การเขียนโปรแกรมแบบอะซิงโครนัส ดังนั้นแบบอะซิงโครนัสบางครั้งก็ไม่ได้ทำสิ่งต่าง ๆ พร้อมกัน แต่บางงานที่ถูกผูกไว้กับ io แบบอะซิงโครนัสสามารถส่งเสริมประสิทธิภาพได้อย่างแท้จริง

ขนานกระบวนทัศน์มักจะหมายถึงแบบมัลติเธรดและ multiprocessing สิ่งนี้สามารถใช้ประโยชน์จากตัวประมวลผลแบบมัลติคอร์อย่างเต็มที่ทำสิ่งต่าง ๆ ได้ในเวลาเดียวกัน


-1

สรุปคำตอบทั้งหมดข้างต้น

  1. การคำนวณแบบขนาน:

▪แก้ปัญหาปริมาณงาน เกี่ยวข้องกับการแบ่งงานใหญ่เป็นชิ้นเล็ก ๆ

▪เกี่ยวข้องกับเครื่องจักร (ต้องการเครื่องหลายเครื่อง / แกน / cpu / โปรเซสเซอร์) เช่น: master slave, ลดแผนที่

การคำนวณแบบขนานมักจะเกี่ยวข้องกับการควบคุมส่วนกลางซึ่งกระจายการทำงานของโปรเซสเซอร์หลายตัว

  1. ไม่ตรงกัน:

▪แก้ปัญหาความล่าช้าเช่นปัญหาของ 'การรอ' เพื่อให้การดำเนินการที่มีราคาแพงเสร็จสิ้นก่อนที่คุณจะทำสิ่งใดได้

▪เกี่ยวข้องกับเธรด (จำเป็นต้องมีหลายเธรด)

เธรด (ใช้ Thread, Runnable, Executor) เป็นวิธีพื้นฐานหนึ่งในการดำเนินการแบบอะซิงโครนัสใน Java

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.