ความหมายของอะซิงโครนัส vs ซิงโครนัส [ปิด]


46

ความหมายของคำว่าอะไรคือสิ่งที่ไม่ตรงกันและซิงโครในสาขาวิทยาศาสตร์คอมพิวเตอร์?

หากคุณ google ความหมายของคำที่คุณจะได้รับต่อไปนี้:

  • Asynchronous: ไม่ได้ที่มีอยู่หรือเกิดขึ้นในเวลาเดียวกัน

  • ซิงโคร: ที่มีอยู่หรือเกิดขึ้นในเวลาเดียวกัน

แต่ดูเหมือนว่าพวกเขาจะใช้ในการถ่ายทอดความหมายตรงข้ามในการเขียนโปรแกรมหรือวิทยาศาสตร์คอมพิวเตอร์:

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

คำศัพท์เหล่านี้ใช้เพื่อถ่ายทอดความหมายตรงกันข้ามในวิทยาการคอมพิวเตอร์หรือฉันไม่มีจุดหรือไม่


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

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

3
ในขณะเดียวกันสิ่งที่เป็นกุญแจสำคัญ :)
การแข่งขัน Lightness กับโมนิก้า

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

2
"ต่อเนื่อง" และ "ไม่ต่อเนื่อง" อาจเป็นทางเลือกที่ดีกว่าในเชิงความหมาย แต่เรือลำนั้นมีวิธีแล่นไปแล้ว
Jared Smith

คำตอบ:


47

ฉันต้องการให้คำตอบซึ่งเกี่ยวข้องโดยตรงกับคำจำกัดความที่คุณพบ เมื่อภารกิจหนึ่ง T1 เริ่มภารกิจที่สอง T2 เหตุการณ์นั้นอาจเกิดขึ้นในลักษณะต่อไปนี้:

ซิงโครนัส: มีอยู่หรือเกิดขึ้นในเวลาเดียวกัน

ดังนั้น T2 รับประกันได้ว่าจะสามารถเริ่มต้นและดำเนินการภายในเวลาชิ้นของ T1 T1 "รอ" สำหรับการสิ้นสุดของ T2 และสามารถดำเนินการต่อได้ในภายหลัง ในแง่นี้ T1 และ T2 เกิดขึ้น "ในเวลาเดียวกัน" (ไม่ใช่ "เป็นแบบขนาน" แต่อยู่ในช่วงเวลาที่ต่อเนื่องกัน)

อะซิงโครนัส: ไม่มีอยู่หรือเกิดขึ้นในเวลาเดียวกัน

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

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


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

6
ไม่ฉันไม่คิดว่าจะทำ การซิงโครไนซ์และพร้อมกันไม่ใช่สิ่งเดียวกัน
Robert Harvey

1
ฉันยินดีที่จะยืนยันว่าคำจำกัดความพจนานุกรมไม่ได้มีประโยชน์กับนักพัฒนาซอฟต์แวร์มากนัก การพยายามแมปคำจำกัดความของพจนานุกรมกับคำศัพท์ทางเทคนิคที่เราใช้อาจไม่เป็นประโยชน์
Robert Harvey

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

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

20

ฉันพบว่าวิธีที่ดีที่สุดในการทำความเข้าใจคือ:

  • ซิงโครนัส: เรารู้เมื่อมันจะเกิดขึ้น (มันเกิดขึ้นเมื่อรหัสอื่นสิ้นสุดลง)
  • แบบอะซิงโครนัส: เราไม่รู้ว่าจะเกิดขึ้นเมื่อใด

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


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

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

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


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

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

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

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

อีกครั้งอะซิงโครนัสก็หมายความว่าคุณไม่รู้ว่ามันจะเกิดขึ้นเมื่อไหร่


คุณอาจสนใจในความแตกต่างระหว่างการดำเนินการ "พร้อมกัน" และ "ขนาน" หรือไม่ .


เผง คำอธิบายที่เสียง OP พบมากเกี่ยวกับการขนานมากกว่าการซิงโครนัส (ถ้าเป็นคำ ... ) asynch vs synch เป็นเรื่องเกี่ยวกับเมื่อการกระทำเริ่มต้นขึ้น (ตอนนี้เมื่อฉันเรียกมันหรือหลังจากนั้นเมื่อตัวกำหนดตารางเวลาตัดสินใจ) ในขณะที่ขนานหมายความว่า "ใช่พวกเขากำลังเกิดขึ้นในเวลาเดียวกัน" เทียบกับลำดับ
Giacomo Alzetta

1
@GiacomoAlzetta ฉันคิดว่าคำนี้คือการซิงโครไนซ์ ฉันพบคำที่คล้ายกันเหล่านี้ด้วย: การซิงโครไนซ์การซิงโครไนซ์และการซิงโครไนซ์ อาจคุ้มค่าคำถามของตัวเอง
Theraot

12

อะซิงโครนัส: ไม่มีอยู่หรือเกิดขึ้นในเวลาเดียวกัน

ซิงโครนัส: มีอยู่หรือเกิดขึ้นในเวลาเดียวกัน

แอตทริบิวต์ async หมายความว่าสคริปต์จะถูกดำเนินการทันทีที่มีการดาวน์โหลดแม้ว่า html จะยังอยู่ในการแยกวิเคราะห์ซึ่งหมายความว่ากระบวนการทั้งสองมีอยู่ในเวลาเดียวกันกับฉัน

นี่มันทำให้สับสนจริงๆ!

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

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

แต่สิ่งสำคัญคือต้องตระหนักว่ามีความเป็นไปได้สามอย่างที่นี่:

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

เมื่อคุณเข้าใจแล้ววัตถุประสงค์ของเวิร์กโฟลว์ async ในภาษาการเขียนโปรแกรมยอดนิยมจะชัดเจนขึ้น:

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

  • ตัวawaitดำเนินการในภาษาเช่น C # เป็นการดำเนินการสั่งซื้อบนเวิร์กโฟลว์แบบอะซิงโครนัส รอคอยคือการรอคอยไม่ตรงกัน ; มันเป็นจุดที่เราแสดงความสัมพันธ์การสั่งซื้อระหว่างสองส่วนของขั้นตอนการทำงานไม่ตรงกันและบอกว่ามีเป็น "การเกิดขึ้นมาก่อน" ความสัมพันธ์ระหว่างรหัสก่อนที่จะรอและรหัสหลังจากรอคอย นี่คือวิธีที่เราใช้ตัวเลือกที่สาม

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

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


6

ฉันเป็นวิศวกรไฟฟ้าและเราจัดการกับซิงโครนัสกับอะซิงโครนัสในวงจรลอจิก

สมมติว่าคุณมี AND-gate (หรือประตูใด ๆ ) ซึ่งมีสองอินพุตและเอาต์พุต

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

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


1
ชอบพอร์ตอนุกรมอะซิงโครนัส / ซิงโครนัส
jiwopene

2

ลองนึกภาพสองดาวเทียมที่กำลังโคจรรอบโลก

  • ดาวเทียมมีระยะเวลาของการหมุนรอบโลกเช่นว่าสำหรับทุกการหมุนเต็มรูปแบบของดาวเคราะห์ดาวเทียมได้ไปทั่วโลกมากกว่าหรือน้อยกว่าหนึ่งครั้ง
  • ดาวเทียม Bมีรอบการหมุนรอบโลกเช่นเดียวกับที่การหมุนรอบตัวเต็มรูปแบบของโลกดาวเทียมได้หมุนรอบโลกเพียงครั้งเดียว

ดาวเทียม B ในตัวอย่างข้างต้นอยู่ในวงโคจร geosynchronous ตามที่กำหนดโดย

มีช่วงเวลาของการหมุนที่สอดคล้องกับการหมุนของโลก

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

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

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

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

func Invoker() {
    DoThis();
    DoThatAsync();

    var foo = CheckThis();
    ... do some work ...
    CheckThat(foo);

    await DoThatAsync();

    CheckThat();
}

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


ฉันชอบสิ่งนี้จริง โดยทั่วไปแล้วมันเป็นป่าตะวันตกของการดำเนินการโดยพลการในฐานะ "asynchronous" กับเส้นทางการดำเนินการที่ชัดเจนที่กำหนดเป็น "synchronous"
Cruncher

ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุด
Barmar

2

ตัวอย่างคอนกรีต

ฉันต้องการเพิ่มตัวอย่างจริงของโลกและเชื่อมต่อพวกเขาเข้ากับโลกวิศวกรรมซอฟต์แวร์ ก่อนอื่นให้พิจารณาสิ่งที่ฉันหวังว่าจะตรงกับคำจำกัดความที่ใช้งานง่ายของคุณของ "ซิงโครนัส": การกระพริบของหิ่งห้อยภายใต้สถานการณ์บางอย่าง ประการที่สองพิจารณาการถ่ายทอดการแข่งขันกีฬาโอลิมปิก 4x100 ของผู้หญิงการแข่งขัน ประการที่สามพิจารณาว่า Trope เก่าจากภาพยนตร์ทหาร: "ผู้ชายซิงโครไนซ์นาฬิกาของคุณ!"

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

การวิเคราะห์

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

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

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

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

การกำหนดคุณสมบัติ

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

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

ขอบเขต

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

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

การเชื่อมต่อซอฟต์แวร์

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

ซิงค์

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

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

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

ความหลากหลายของกระบวนการ

ด้วยเหตุนี้เราสามารถคิดค้นคำศัพท์สองสามคำเพื่อช่วยให้เราเห็นว่ามีสามสิ่งที่เกิดขึ้น: "ซิงโครนัสที่เป็นเนื้อเดียวกัน", "ซิงโครนัสที่ต่างกัน" และ "การซิงโครไนซ์ตามลำดับ" ดังนั้นเมื่อนักแสดงปฏิบัติภารกิจเดียวกันพร้อมกัน (FEA หิ่งห้อย) พวกเขาจะ "เป็นเนื้อเดียวกัน" เมื่อพวกเขาปฏิบัติภารกิจที่แตกต่างกันพร้อมกัน (ทหารที่วิ่งเทียบกับการคลานและว่ายน้ำไปยังจุดหมายปลายทางฟิสิกส์กับเสียงและหัวข้อ AI ในเกม) พวกเขาเป็น "ต่างกัน" เมื่อพวกเขากำลังทำงานหนึ่งครั้งพวกเขาจะ "เรียงตามลำดับ" (นักวิ่งรีเลย์บล็อก I / O) พวกเขาอาจดูแตกต่างกันมาก แต่พวกเขาแบ่งปันคุณสมบัติที่สำคัญอย่างหนึ่ง: นักแสดงทุกประเภทแสดงการรอเพื่อให้แน่ใจว่าทุกคนมาถึงจุดประสานในเวลาเดียวกัน ในระหว่างจุดการซิงโครไนซ์หรือ "การดำเนินการเดียวกัน" ไม่เกี่ยวข้องกับคุณสมบัติของการซิงโครไนซ์

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

async

ตอนนี้ให้ลองอ่าน "async I / O" เมื่อโปรแกรมของคุณส่งคำขอไปยังระบบปฏิบัติการเพื่ออ่านบิตของข้อมูลจากการจัดเก็บการเรียกร้องผลตอบแทนทันที ลองละเว้นการโทรกลับและมุ่งเน้นการสำรวจ โดยทั่วไปช่วงเวลาที่ข้อมูลพร้อมใช้งานกับโปรแกรมของคุณไม่ตรงกับจุดพิเศษใด ๆ ในเวลาที่เกี่ยวข้องกับเธรดโปรแกรมของคุณ หากโปรแกรมของคุณไม่รอข้อมูลอย่างชัดเจนเธรดจะไม่ทราบว่าเกิดขึ้นเมื่อใด มันจะค้นพบว่าข้อมูลกำลังรอในครั้งต่อไปที่ตรวจสอบ

ไม่มีเวลาประชุมพิเศษที่ระบบปฏิบัติการและเธรดโปรแกรมตกลงส่งข้อมูล พวกมันเหมือนเรือสองลำแล่นผ่านในเวลากลางคืน อะซิงโครนัสเป็นลักษณะของการขาดงานนี้. แน่นอนเธรดโปรแกรมมักจะจบลงด้วยการรอการดำเนินการ I / O หลังจากทั้งหมด แต่ก็ไม่จำเป็นต้อง สามารถทำการคำนวณอื่น ๆ ได้อย่างมีความสุขในขณะที่การดึงข้อมูล I / O เกิดขึ้นและตรวจสอบในภายหลังเมื่อมีเวลาว่าง แน่นอนว่าเมื่อระบบปฏิบัติการดึงข้อมูลเสร็จแล้วก็ไม่ได้รอคอยเช่นกัน มันแค่ทำให้ข้อมูลบางแห่งสะดวกและดำเนินธุรกิจต่อไป ในกรณีนี้มันเหมือนโปรแกรมส่งกระบองออกไปยังระบบปฏิบัติการและระบบปฏิบัติการรอบต่อมาวางกระบองลงบนพื้นพร้อมกับข้อมูลและเดินออกจากแทร็ค โปรแกรมอาจหรือไม่รอรอบรับ hand-off

ความเท่าเทียม

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

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

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

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


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

ฉันคิดว่าตัวอย่างอื่นแสดงให้เห็นถึงการกระทำพร้อมกันกับการกระทำที่แตกต่างกันซึ่งฉันเชื่อว่าทำให้เกิดความสับสนของ OP มาก
คนตัดหญ้า

1

วิธีหนึ่งที่จะคิดเกี่ยวกับมันเป็นSIMDคำแนะนำเช่นAVX นี่คือตัวอย่างของวิธีการใช้งาน

คำแนะนำที่ซิงโครนัส SIMD ช่วยให้คุณสามารถทำการคำนวณหลายอย่างในเวลาเดียวกันได้อย่างแม่นยำในหัวข้อเดียวกันโดยใช้คำสั่งเดียวในหลายข้อมูล

ในขณะที่มัลติเธรดแบบอะซิงโครนัสช่วยให้คุณทำการคำนวณหลายครั้งที่ "อาจ" "ค่อนข้างคล้ายกัน" "ครั้ง"

รวมสิ่งนี้กับคำจำกัดความต่อไปนี้:

คำคุณศัพท์ซิงโครนัส syn · chro · nous | \ ˈsiŋ-krə-nəs, insin-

1: เกิดขึ้นมีอยู่หรือเกิดขึ้นอย่างแม่นยำในเวลาเดียวกัน [เหมืองเน้น]

คำคุณศัพท์อะซิงโครนัส \ (ˌ) ā-ˈsiŋ-krə-nəs, -ˈsin- \

1: [... ]: ไม่ซิงโครนัส


1

การเปรียบเทียบที่ทำให้ฉันเข้าใจความแตกต่างระหว่าง Sync vs Async กับ Multi-threaded คือการปรุงอาหารในครัว

ลองนึกภาพคุณกำลังทำพาสต้า คุณมีสามขั้นตอน:

  1. ต้มและระบายพาสต้า
  2. เตรียมซอส
  3. รวมพาสต้าและซอส

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

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

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


นี่เป็นความคล้ายคลึงที่ดีทีเดียว
Robert Harvey

0

คำถามที่ดีและคำศัพท์ที่มักใช้ในรูปแบบที่แตกต่างกันซึ่งนำไปสู่ความสับสน

คำตอบของฉันคือเงื่อนไขเหล่านี้สัมพันธ์ - และสิ่งที่สัมพันธ์กับเป็นโปรแกรมหลักที่กำลังดำเนินการ (หรือบางครั้งเพื่อเธรด)

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

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


การปิดกั้นไม่แตกต่างจากแบบอะซิงโครนัส
user207421

1
@ user207421 โปรดอธิบายอย่างละเอียดเพราะฉันจะเรียกพวกเขาคำพ้องความหมายในบริบทนี้
Jacob Raihle

0

"ซิงโคร" หมายถึงว่าทั้งสองเหตุการณ์ที่เกิดขึ้นในเวลาเดียวกัน - แต่ซึ่งเหตุการณ์ที่เกิดขึ้น?

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

เมื่อเราพูดว่า "ประตูตรรกะซิงโครนัส" เราหมายถึงประตูตรรกะถูกซิงโครไนซ์กับนาฬิกา cpu

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

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

... และฉันค่อนข้างแน่ใจว่าคุณสามารถใช้คำในบริบทมากยิ่งขึ้นเพราะ "สิ่งที่เกิดขึ้นในเวลาเดียวกัน" เป็นความคิดทั่วไปค่อนข้าง :-)


0

ฉันคิดว่ากุญแจสำคัญของความสับสนของคุณสามารถสรุปได้โดย:

แอตทริบิวต์ async หมายความว่าสคริปต์จะถูกดำเนินการทันทีที่มีการดาวน์โหลดแม้ว่า html จะยังอยู่ในการแยกวิเคราะห์

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

ในการเขียนโปรแกรมหมายถึงซิงโครนัส:

ข้อมูลทั้งหมดที่คุณสนใจนั้นมีอยู่ในหน่วยความจำ ณ เวลาที่คุณเรียกใช้งานลอจิก

ในขณะที่ไม่ตรงกันหมายความว่า:

ข้อมูลบางส่วนที่คุณสนใจยังไม่มีอยู่และมีอยู่ในบางจุดในอนาคต

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

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

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

ดังนั้นเพื่อสรุป:

  • สคริปต์แบบซิงโครนัสจะถูกแยกวิเคราะห์พร้อมกับ html

  • สคริปต์แบบอะซิงโครนัสจะถูกแยกวิเคราะห์ในอนาคต

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

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