การประมวลผลแบบอะซิงโครนัสกับการซิงโครนัสหมายถึงอะไรจริง ๆ ? [ปิด]


1186

ความแตกต่างระหว่างการดำเนินการแบบอะซิงโครนัสและการซิงโครนัสคืออะไร


... หรือการดำเนินการ "ต่อเนื่องเทียบกับขนาน" ... แม้ว่าการขนานที่แท้จริงนั้นต้องใช้หลายคอร์
samis

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

คำตอบ:


1747

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

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

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

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


246
สิ่งที่ทำให้ฉันสับสนอย่างมากก็คือ "ในเวลาเดียวกัน" หมายความว่าแบบซิงโครนัสแต่เมื่อใช้ในความหมายข้างต้นมันหมายถึงการเรียงลำดับและแบบอะซิงโครนัสหมายถึง "ไม่ในเวลาเดียวกัน" ... ? มีคนอธิบายความขัดแย้งนี้ได้ไหม
ดาเมียนโรช

45
@ Zenen: ในบริบทนี้บล็อคโค้ดทั้งหมดคือสิ่งที่เราเกี่ยวข้อง ซิงโครนัสหมายความว่าบล็อกจะถูกดำเนินการในเวลาเดียวกัน (แม้ว่าใช่ส่วนประกอบจะถูกดำเนินการตามลำดับ) อะซิงโครนัสหมายความว่าการบล็อกไม่ได้ดำเนินการทั้งหมดในเวลาเดียวกัน
อดัมโรบินสัน

8
การประมวลผลแบบอะซิงโครนัสยังเกิดขึ้นเมื่อโปรแกรมส่งข้อความไปยังคิว (เช่นในระบบส่งข้อความเช่น ActiveMQ, WebSphere MQ, HornetQ, MSMQ, ฯลฯ ) ในกรณีนี้การเรียกแบบอะซิงโครนัสไม่เกี่ยวข้องกับการเขียนโปรแกรมแบบมัลติเธรดหรือการจัดการพร้อมกันในระดับระบบปฏิบัติการ
เปาโลเมอร์สัน

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

14
เงื่อนไขมาจากวิศวกรรม en.wikipedia.org/wiki/Asynchronous_system
Tom Padilla

1151

ซิงโครนัส / อะซิงโครนัสไม่มีอะไรเกี่ยวข้องกับมัลติเธรด

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

ซิงโครนัส (หนึ่งเธรด):

1 thread ->   |<---A---->||<----B---------->||<------C----->|

ซิงโครนัส (มัลติเธรด):

thread A -> |<---A---->|   
                        \  
thread B ------------>   ->|<----B---------->|   
                                              \   
thread C ---------------------------------->   ->|<------C----->| 

อะซิงโครนัส (หนึ่งเธรด):

         A-Start ------------------------------------------ A-End   
           | B-Start -----------------------------------------|--- B-End   
           |    |      C-Start ------------------- C-End      |      |   
           |    |       |                           |         |      |
           V    V       V                           V         V      V      
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->| 

แบบอะซิงโครนัส (แบบมัลติเธรด):

 thread A ->     |<---A---->|
 thread B ----->     |<----B---------->| 
 thread C --------->     |<------C--------->|
  • เริ่มต้นและจุดสิ้นสุดของงาน A, B, C แทนด้วย<, >ตัวละคร
  • เวลาซีพียูที่แสดงโดยแถบแนวตั้ง |

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


ตัวอย่าง ASYNCHRONOUS

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

ตัวอย่างซิงโครนัส:

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


92
ทำไมคำในโลกถึงมีความหมายต่างกันในคอมพิวเตอร์ ... ปล่อยให้ฉันกลับมาที่นี่ ... จากพจนานุกรม .. ซิงโครนัส: เกิดขึ้นในเวลาเดียวกัน อะซิงโครนัส: ไม่เกิดขึ้นในเวลาเดียวกัน
มูฮัมหมัดอูเมอร์

17
แต่อย่างที่คุณเห็นในคอมพิวเตอร์มันหมายถึงสิ่งตรงกันข้าม
Muhammad Umer

5
บางทีระบบการตั้งชื่อจะขึ้นอยู่กับว่าการเริ่มต้นของงานนั้น "ตรงกัน" กับความสำเร็จของงานอื่นหรือไม่?
Charles Bretana

11
@ MuhammadUmer: ในโลกคอมพิวเตอร์ที่เกิดขึ้นในเวลาเดียวกันเรียกว่าการทำงานพร้อมกัน
Roy Ling

5
IMHO รูปภาพเหล่านี้ไม่ได้อธิบายถึงการดำเนินการแบบซิงโครนัส vs asycnhronous ตัวอย่างเช่นรูปภาพที่สองแสดงถึงว่าภารกิจแบบอะซิงโครนัสต้องใช้หลายเธรด จริงๆแล้วมันไม่ได้ และงานนั้นก็ต้องทำงานแบบขนานซึ่งไม่ใช่ข้อกำหนดเช่นกัน หรือรูปภาพสำหรับ "ซิงโครนัส" แสดงให้เห็นอย่างชัดเจนว่างานได้รับการส่งแบบอะซิงโครนัสในบางไซต์การโทรและตอนนี้ดำเนินการในตัวจัดกำหนดการงานอนุกรม;) IMO รูปภาพกำลังทำให้เข้าใจผิด
CouchDeveloper

641

ในแง่ง่ายกว่า:

พร้อมกัน

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

ไม่ตรงกัน

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


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

เพียงเพิ่ม ... อาจเป็นไปได้ว่าการดำเนินการจะดำเนินการเหมือนอยู่ในคิวในการดำเนินการแบบอะซิงโครนัส ... แต่นั่นไม่ได้บังคับเลย
Sreekanth Karumanaghat

5
ตัวอย่างที่ง่ายและเป็นจริงมาก
Manish

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

334

คำอธิบายง่ายๆผ่านการเปรียบเทียบ

การดำเนินการแบบซิงโครนัส

เจ้านายของฉันเป็นคนไม่ว่าง เขาบอกให้ฉันเขียนรหัส ฉันบอกเขาว่า: สบายดี ฉันเริ่มต้นและเขาดูฉันเหมือนอีแร้งยืนอยู่ข้างหลังฉันจากไหล่ของฉัน ฉันชอบ "Dude, WTF: ทำไมคุณไม่ไปและทำอะไรบางอย่างในขณะที่ฉันเสร็จสิ้น"

เขาชอบ: "ไม่ฉันกำลังรอที่นี่จนกว่าคุณจะเสร็จสิ้น" นี่คือซิงโครนัส

การดำเนินการแบบอะซิงโครนัส

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

(รับคำแนะนำของฉัน: ไม่ควรทำงานกับเจ้านายที่อยู่ข้างหลังคุณ)


28
ฉันทำไปแล้ว ... มันสนุกกว่าเมื่อคุณทำสิ่งนี้เป็นการลาออก
Daedric

91

การทำงานแบบซิงโครนัสหมายถึงการทำงานที่เกิดขึ้นในซีรีส์เดียว A->B->C->D. หากคุณกำลังเรียกรูทีนเหล่านั้นAจะทำงานแล้วเสร็จจากนั้นBจะเริ่มจากนั้นจึงเสร็จสิ้นจากนั้นCจะเริ่มเป็นต้น

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

เริ่มต้น A->B->C->D->รอสำหรับการAให้เสร็จ

ประโยชน์คือการที่คุณสามารถดำเนินการB, CและหรือDในขณะที่Aยังคงทำงานอยู่ (ในพื้นหลังในหัวข้อที่แยกต่างหาก) เพื่อให้คุณสามารถใช้ประโยชน์จากทรัพยากรที่ดีขึ้นของคุณและมีน้อย "แฮงค์" หรือ "รอ"


@ Reed Copsey ...... ขอบคุณสำหรับคำอธิบายที่ดี ..... แค่ต้องการข้อมูลเพิ่มเติมเกี่ยวกับ Async-Exec ...... จากคำตอบของคุณใน Async Exec .... เริ่ม A-> B-> C-> D-> รอให้ A เสร็จสิ้น ... ดังนั้น A, B, C, D เริ่มต้นครั้งละ ...... และพวกเขารอให้ A จบ ..... B จะเสร็จสิ้นหลังจาก A เสร็จสิ้นและ C หลังจาก B เป็นต้นไป ...... ? หรือ B จบก่อนจากนั้น A สามารถจบได้?
Devrath

8
@Devrath การดำเนินการสามารถเสร็จสิ้นในลำดับใดก็ได้
Reed Copsey

59

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

พร้อมกัน
   | -------- -------- |
                     | -------- B -------- |

กระบวนการอะซิงโครนัสในทางกลับกันไม่มีการซิงโครไนซ์จุดเริ่มต้นและจุดสิ้นสุด:

ไม่ตรงกัน
   | -------- -------- |
         | -------- B -------- |

โดยที่ Process A คาบเกี่ยวกันกับกระบวนการ B พวกเขากำลังทำงานพร้อมกันหรือแบบซิงโครนัส (คำจำกัดความของพจนานุกรม) ดังนั้นความสับสน

UPDATE: Charles Bretana ปรับปรุงคำตอบของเขาดังนั้นคำตอบนี้จึงเป็นเพียงตัวช่วยจำที่เรียบง่าย


2
สำเนาคำตอบของชาร์ลส์เบรตานา
Dinesh Saini

2
@DineshSaini - แผนภาพของฉันแตกต่างกันเล็กน้อย เพื่อความชัดเจนฉันวาง A ไว้ด้านบนของ B ในทั้งสองกรณีโดยเน้นว่าจุดเริ่มต้นและจุดสิ้นสุดถูกซิงโครไนซ์หรือไม่ แผนภาพของ Charles Bretana วางกระบวนการซิงโครนัสตามลำดับโดยไม่ต้อง "ซิงค์" อะไรเลย (ฉันจะแสดงความคิดเห็นด้านล่างคำตอบของเขาเพื่อ "ปรับปรุง" มัน แต่ตระหนักว่ามันจะง่ายขึ้นเพียงเพื่อแสดงแผนภาพใหม่.)
entr0p3te

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

55

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

ตัวอย่างเช่น:

    static void Main(string[] args)
    {
        Console.WriteLine("Before call");
        doSomething();
        Console.WriteLine("After call");
    }

    private static void doSomething()
    {
        Console.WriteLine("In call");
    }

สิ่งนี้จะเป็น ouput เสมอ:

Before call
In call
After call

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

Before call
After call
In call

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


34

ฉันคิดว่านี่เป็นคำอธิบายรอบ ๆ เล็กน้อย แต่ก็ยังคงความกระจ่างโดยใช้ตัวอย่างชีวิตจริง

ตัวอย่างเล็ก ๆ :

สมมติว่าการเล่นเสียงเกี่ยวข้องกับสามขั้นตอน:

  1. รับเพลงที่บีบอัดจากฮาร์ดดิสก์
  2. ขยายเสียง
  3. เล่นเสียงที่ไม่มีการบีบอัด

หากเครื่องเล่นเสียงของคุณทำตามขั้นตอน 1,2,3 ตามลำดับสำหรับทุกเพลง คุณจะต้องรอสักครู่เพื่อฟังเพลงจนกว่าเพลงจะดึงข้อมูลและคลายการบีบอัด

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


32

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

ซิงโครนัส (การบล็อก) - แสดงถึงว่างานจะถูกดำเนินการทีละรายการ งานถัดไปจะเริ่มขึ้นหลังจากงานก่อนหน้านี้เสร็จสิ้น Task 2ยังไม่เริ่มจนกว่าTask 1จะเสร็จสิ้น

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

ดังนั้นคำตอบเกี่ยวกับการซิงค์และ async: ใน iOS , ใน Android


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

@ sαmosΛrisคุณสามารถพิจารณาเธรดเช่นแกน X ที่ระบุว่าไทม์ไลน์
yoAlex5

แกน x ถูกใช้ตามอัตภาพเป็นมิติพิเศษ แกนทีสำหรับเวลา - ความแตกต่างสำคัญที่พบในการวิเคราะห์ความซับซ้อนของอัลกอริทึม
samis

23

กล่าวง่ายๆว่าการดำเนินการแบบอะซิงโครนัสกำลังทำสิ่งต่าง ๆ อยู่เบื้องหลัง

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

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


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

4
มันไม่จำเป็นต้องเร็วขึ้น มันเกี่ยวกับการไม่บล็อกเธรดหลักเพื่อให้สามารถประมวลผลอินพุตผู้ใช้ชนิดอื่นได้ ตัวอย่างเช่นผู้ใช้อาจต้องการยกเลิกการดาวน์โหลดหรือเริ่มดาวน์โหลดไฟล์อื่นพร้อมกัน
Michał Piaskowski

19

เป็นตัวอย่างง่ายๆ

พร้อมกัน

ลองนึกภาพนักเรียนโรงเรียน 3 คนได้รับคำสั่งให้วิ่งแข่งวิ่งบนถนน

นักเรียนคนที่ 1 วิ่งตามระยะทางที่กำหนดหยุดและส่งไม้เท้าไปยังอันดับ 2 ไม่มีใครเริ่มทำงาน

1------>
        2.
                3.

เมื่อนักเรียนคนที่สองดึงกระบองเธอเริ่มวิ่งตามระยะทางที่กำหนด

      1.
        2------>
                3.

นักเรียนคนที่ 2 ได้เชือกผูกรองเท้าของเธอ ตอนนี้เธอหยุดแล้วผูกอีกครั้ง ด้วยเหตุนี้เวลาสิ้นสุดของ 2nd ได้ถูกขยายออกไปและเวลาเริ่มต้นของ 3rd ได้ล่าช้า

      1.
        --2.--->
                3.

รูปแบบนี้จะดำเนินต่อไปจนถึงครั้งที่ 3 ที่ดึงกระบองจากวันที่ 2 และจบการแข่งขัน

ไม่ตรงกัน

แค่ลองนึกภาพคน 10 คนที่เดินบนถนนสายเดียวกัน พวกเขาไม่ได้อยู่ในคิวแน่นอนเพียงแค่เดินไปตามสถานที่ต่าง ๆ บนถนนในแบบที่แตกต่างกัน

เชือกผูกรองเท้าของคนที่ 2 หลุดออกมา เธอหยุดที่จะรับมันขึ้นมาอีกครั้ง

แต่ไม่มีใครรอให้เธอผูกมันไว้ คนอื่นยังคงเดินแบบเดียวกับที่พวกเขาเคยทำมาก่อน

10-->    9-->
   8--> 7-->   6-->
 5-->     4-->
1-->   2.    3-->

18

ฉันสร้าง gif เพื่ออธิบายสิ่งนี้หวังว่าจะเป็นประโยชน์: ดู, บรรทัดที่ 3 เป็นแบบอะซิงโครนัสและอื่น ๆ แบบซิงโครนัส ทุกบรรทัดก่อนบรรทัดที่ 3 ควรรอจนกระทั่งก่อนที่บรรทัดจะทำงานเสร็จ แต่เนื่องจากบรรทัดที่ 3 เป็นแบบอะซิงโครนัสบรรทัดถัดไป (บรรทัดที่ 4) อย่ารอให้บรรทัดที่ 3 แต่บรรทัดที่ 5 ควรรอให้บรรทัดที่ 4 ทำงานให้เสร็จ และบรรทัดที่ 6 ควรรอสาย 5 และ 7 สำหรับ 6 เนื่องจากบรรทัด 4,5,6,7 ไม่ใช่แบบอะซิงโครนัส บรรทัดที่ 3 คือแบบอะซิงโครนัสและอื่น ๆ


12

เมื่อดำเนินการตามลำดับเช่น: a> b> c> d> หากเราพบความล้มเหลวในระหว่างการดำเนินการเช่น:

a
b
c
fail

จากนั้นเราเริ่มต้นใหม่ตั้งแต่ต้น:

a
b
c
d

นี่คือซิงโครนัส

อย่างไรก็ตามหากเรามีลำดับเดียวกันในการดำเนินการ: a> b> c> d> และเรามีความล้มเหลวตรงกลาง:

a
b
c
fail

... แต่แทนที่จะรีสตาร์ทตั้งแต่ต้นเราเริ่มต้นใหม่จากจุดที่ล้มเหลว:

c
d

... สิ่งนี้รู้ว่าไม่ตรงกัน


1
คุณจะช่วยให้แม่นยำมากขึ้นในสิ่งที่คุณหมายถึงโดยให้บริบทกับตัวอย่างของคุณมากขึ้น
krichard

5
คำตอบนี้ไม่ถูกต้อง
user207421

7

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


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

1
ซิงโครนัสไม่ได้หมายถึง 'ทั้งหมดในเวลาเดียวกัน' ในการคำนวณ คุณกำลังสับสนกับการซิงโครนัสและ 'ขนานกับซีรีส์' กับชาและชาหวาน คำตอบไม่สมเหตุสมผลเลย
user207421

7

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


มีหลายสิ่งที่ดำเนินการไม่ในเวลาเดียวกันที่เรียกว่า Multithreading แทนที่จะเป็นแบบอะซิงโครนัส
Sreekanth Karumanaghat

7

ใช้ตัวอย่างคำแนะนำในการทำอาหารเช้า

  1. เทกาแฟหนึ่งถ้วย
  2. ตั้งกระทะให้ร้อนแล้วทอดไข่สองฟอง
  3. ทอดเบคอนสามชิ้น
  4. ขนมปังปิ้งสองชิ้น
  5. เพิ่มเนยและแยมกับขนมปัง
  6. เทน้ำส้มแก้วหนึ่งแก้ว

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

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

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

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


4

การดำเนินการแบบซิงโครนัสจะทำงานก่อนที่จะกลับไปที่ผู้โทร

การดำเนินการแบบอะซิงโครนัส (ส่วนใหญ่หรือทั้งหมด) ทำงานหลังจากกลับไปที่ผู้โทร


ลิงก์ตาย
หวังว่า

1

เกี่ยวกับคำจำกัดความ "ในเวลาเดียวกัน " ของการดำเนินการแบบซิงโครนัส (ซึ่งบางครั้งทำให้เกิดความสับสน) นี่เป็นวิธีที่ดีในการทำความเข้าใจ:

การดำเนินการแบบซิงโครนัส : งานทั้งหมดภายในบล็อกของรหัสจะถูกดำเนินการทั้งหมดในเวลาเดียวกัน

การดำเนินการแบบอะซิงโครนัส : งานทั้งหมดภายในบล็อกของรหัสไม่ได้ดำเนินการทั้งหมดในเวลาเดียวกัน


ฉันจะเห็นด้วยกับเรื่องนี้มากขึ้นถ้าคุณพูดว่า 'มีประสิทธิภาพในเวลาเดียวกัน' หรือ 'เพื่อจุดประสงค์เชิงปฏิบัติ' .. ฉันคิดว่า downvote นั้นเป็นคำที่ไม่ถูกต้องว่าสิ่งต่างกำลังทำจริงในเวลาเดียวกัน
Dean Radcliffe

1

ฉันคิดว่าวิธีที่ดีในการคิดว่ามันคือ Relay Race แบบคลาสสิก

ซิงโครนัส : กระบวนการเช่นเดียวกับสมาชิกในทีมเดียวกันพวกเขาจะไม่ดำเนินการจนกว่าพวกเขาจะได้รับ baton (สิ้นสุดการดำเนินการตามกระบวนการ / นักวิ่งก่อนหน้า) และพวกเขาทั้งหมดทำหน้าที่ซิงค์กัน

อะซิงโครนัส : ที่กระบวนการต่าง ๆ เช่นสมาชิกของทีมต่าง ๆ บนแทร็กเรซแทร็กเดียวกันพวกเขาจะวิ่งและหยุด async กัน แต่ในการแข่งขันเดียวกัน (การดำเนินการของโปรแกรมโดยรวม)

มันสมเหตุสมผลหรือไม่


1

คำจำกัดความภาษาอังกฤษอื่นของการซิงโครไนซ์อยู่ที่นี่

ประสานงาน; รวมกัน.

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

ดังนั้นงานอะซิงโครนัสจึงไม่ได้ประสานงานกับงานอื่นในขณะที่งานซิงโครนัสจะประสานงานกับงานอื่นดังนั้นงานหนึ่งจึงเสร็จสิ้นก่อนที่งานอื่นจะเริ่ม

คำถามนั้นแตกต่างกันอย่างไร


0

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


0

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

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