ความแตกต่างระหว่างวิธีการเกิดพร้อมกันขนานและวิธีการไม่ตรงกันคืออะไร?


177

การทำงานพร้อมกันคือการทำงานสองอย่างพร้อมกันบนเธรดแยกกัน อย่างไรก็ตามวิธีการแบบอะซิงโครนัสทำงานแบบขนาน แต่อยู่บน 1 เธรดเดียวกัน สิ่งนี้สำเร็จได้อย่างไร นอกจากนี้สิ่งที่เกี่ยวกับความเท่าเทียมกัน?

อะไรคือความแตกต่างระหว่างแนวคิดทั้งสามนี้


8
คำว่า "อะซิงโครนัส" อาจหมายถึงสิ่งต่าง ๆ มากมาย คำเหล่านั้นเกี่ยวข้องกัน แต่ไม่ได้อธิบายสิ่งต่าง ๆ ที่แยกจากกัน ความหมายทับซ้อนและแตกต่างกันตามสถานการณ์
Pointy

2
ดังนั้นการทำงานพร้อมกันครั้งแรกจึงใช้กระบวนการสองกระบวนการขึ้นไปในเวลาเดียวกัน เมื่อพ้นทางนั้นการอยู่พร้อมกันไม่ขนานกัน กระบวนการแบบขนานต้องใช้สองคอร์หรือมากกว่าในขณะที่กระบวนการที่เกิดขึ้นพร้อมกันสามารถแชร์แกนเดี่ยว
Rick O'Shea

คำตอบ:


139

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

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

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

จากเปอร์สเปคทีฟผู้ใช้ดูเหมือนว่ามัลติทาสก์ แต่อาจไม่ใช่


แก้ไข

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


34
ฉันขอยืนยันว่าคุณมีความเท่าเทียมและการพัวพันกันในย่อหน้าแรกของคุณ การเกิดขึ้นพร้อมกันหมายถึงการจัดการหลายเธรดของการดำเนินการโดยที่ความขนานเป็นพิเศษมากขึ้น การเกิดขึ้นพร้อมกันเป็นคำที่กว้างขึ้นซึ่งสามารถรวมขนานกัน
มาร์ค H

7
ในขณะที่คำทั้งสองมีความคล้ายคลึงกันมากและอาจสับสน (และบ่อยครั้ง) พวกเขามีคำจำกัดความที่แตกต่างกัน: เกิดขึ้นพร้อมกัน = ที่มีอยู่เกิดขึ้นหรือทำในเวลาเดียวกัน Parallel = ของหรือเกี่ยวข้องกับประสิทธิภาพที่ชัดเจนหรือแท้จริงของการดำเนินงานมากกว่าหนึ่งครั้งในเวลาเดียวกันโดยอุปกรณ์เดียวกันหรือต่างกัน อย่างที่คุณเห็นว่าขนานไม่ได้หมายความว่าจะเกิดขึ้นพร้อมกัน แต่อาจจะปรากฏขึ้นพร้อมกัน ในตอนท้ายของวันคำมักจะใช้แทนกันได้และด้วยn dev เป็นห้องที่คุณอาจได้รับn + 1คำจำกัดความ)
Lazarus

3
@ Mehrdad ถ้าคุณจะนิยามคำศัพท์พจนานุกรมของคุณเกี่ยวกับการใช้ในสื่อการตลาดแล้วฉันคิดว่าคุณมีแนวโน้มที่จะพบว่าตัวเองเสียเปรียบ
Lazarus

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

2
@ Frankankadocaj ได้ถูกต้องแล้ว เกิดขึ้นพร้อมกันหมายความว่าโปรแกรมสามารถแบ่งออกเป็นหน่วย (หน่วยเป็นหัวข้อหลัก) ที่สามารถเรียกใช้ในลำดับใดก็ได้และมีผลลัพธ์ที่แน่นอน Parallel หมายถึงยูนิต / เธรดเหล่านี้กำลังถูกรันพร้อมกันในโปรเซสเซอร์หลายตัว

89

ในระยะสั้น

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

โปรดจำไว้ว่าการเห็นพ้องด้วยและความเท่าเทียมนั้นไม่เหมือนกัน

ความแตกต่างระหว่างการเกิดพร้อมกันกับการขนาน

ทีนี้มาดูความแตกต่างที่เห็นได้ชัดเจนระหว่างการเกิดพร้อมกันและการขนานกัน

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

การเกิดพร้อมกันคือการรวมกันของกระบวนการดำเนินการอย่างเป็นอิสระในขณะที่การขนานคือการคำนวณ (อาจเกี่ยวข้อง) พร้อมกัน

การเกิดขึ้นพร้อมกันนั้นเกี่ยวกับการจัดการกับสิ่งต่าง ๆ มากมายในคราวเดียว ความเท่าเทียมเป็นเรื่องเกี่ยวกับการทำสิ่งต่าง ๆ มากมายในครั้งเดียว

แอปพลิเคชันสามารถเกิดขึ้นพร้อมกัน - แต่ไม่ขนานกันซึ่งหมายความว่ามันประมวลผลมากกว่าหนึ่งงานในเวลาเดียวกัน แต่ไม่มีงานสองงานที่ดำเนินการในเวลาเดียวกันทันที

แอปพลิเคชันสามารถขนานกัน แต่ไม่พร้อมกันซึ่งหมายความว่ามันประมวลผลงานย่อยหลายงานในซีพียูหลายคอร์ในเวลาเดียวกัน

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

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

เห็นพ้องด้วย

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

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

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

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

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

วิธีการแบบอะซิงโครนัส

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


2
มีประโยชน์มาก ขอบคุณ
Neha

ฉันยังคงสับสนเกี่ยวกับ Async เทียบกับการทำงานพร้อมกัน ฉันเคยเห็นวลี "การเรียกใช้งานแบบอะซิงโครนัส" และ "การเรียกใช้งานพร้อมกัน" การรันภารกิจอะซิงโครนัสและการรันภารกิจพร้อมกันดูเหมือนจะหมายถึงสิ่งเดียวกันหรือไม่
Moondra

1
@Moondra Async ภารกิจทำงานบนเธรดเดี่ยวไม่มีอะไรเกี่ยวข้องกับมัลติเธรด งาน async ส่งงานไปยังกระบวนการภายนอกนอกแอปพลิเคชันของคุณ ... เช่นฐานข้อมูลตัวอ่านไฟล์ ... นี่คือกระบวนการ IO จากนั้นจะมีการเพิ่มการเรียกกลับในกระบวนการเพื่อดำเนินการเมื่อกระบวนการ IO เสร็จสิ้น สิ่งที่ฉันไม่แน่ใจคือมีคุณลักษณะ "async" บางอย่างในภาษาการเขียนโปรแกรมที่สร้างเธรดใหม่แยกต่างหากเมื่อคุณเรียกใช้งาน async ฉันได้ยิน C # เป็นหนึ่ง แต่ฉันไม่แน่ใจดังนั้น
Tobi Owolawi

56

การเกิดขึ้นพร้อมกันคือเมื่อการดำเนินการของหลาย ๆ งานเป็น interleaved แทนที่จะเป็นงานที่ถูกดำเนินการตามลำดับทีละรายการ

Parallelismคือเมื่องานเหล่านี้ถูกดำเนินการแบบขนาน

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


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

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

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


6
ภาพประกอบที่เรียบง่ายและมีประสิทธิภาพ
contactmatt

1
การเกิดพร้อมกันเหมือนกับ asynchrony หรือไม่
เลขที่

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

1
ดังนั้นอะซิงโครนัสจึงส่วนใหญ่เกี่ยวกับการบล็อกและไม่บล็อก
แดเนียล

15

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


13

มีหลายสถานการณ์ที่สามารถเกิดขึ้นพร้อมกัน:

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

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

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


นี่เป็นการเปรียบเทียบที่ดีจริงๆ! ขอบคุณ มันจะยุติธรรมหรือไม่ที่จะบอกว่าการใช้งานพร้อมกันสามารถกำหนดได้ด้วยคำจำกัดความมัลติเธรดของคุณ? concurrency = multithreading บน single-core ซึ่งดูเหมือนว่ามันกำลังเกิดขึ้นในเวลาเดียวกัน แต่มันสลับไปมาอย่างรวดเร็วจริง ๆ เหรอ?
wongz

3

เห็นพ้องด้วย

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

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

Parallelism หมายถึงแอพพลิเคชั่นที่แยกงานออกเป็นงานย่อยขนาดเล็กซึ่งสามารถประมวลผลแบบขนานเช่นบน CPU หลายตัวในเวลาเดียวกัน

การเห็นพ้องด้วยกับความเท่าเทียมในรายละเอียด

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

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

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

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

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

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

จากhttp://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html


3

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

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

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

"Asynchronous" หมายถึงการเป็นตัวแทนของการขนานที่เป็นทางการสามสิ่งพื้นฐานที่มักจะเกี่ยวข้องในการขนาน: 1) กำหนดงานเริ่มต้น (พูดเมื่อมันเริ่มและสิ่งที่ได้รับพารามิเตอร์) 2) สิ่งที่ต้องทำหลังจากเสร็จสิ้นและ 3) สิ่งที่รหัสควรทำต่อไปในระหว่าง

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


2

มีความหมายเล็กน้อยที่จะล้างที่นี่:

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

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

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

ดังนั้นกระบวนการหรือการดำเนินการแบบอะซิงโครนัสอาจถูกประมวลผลแบบขนานหรือพร้อมกันกับผู้อื่น


2

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

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

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

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


2

"Sync และ async เป็นแบบจำลองการเขียนโปรแกรมพร้อมกันและแบบขนานเป็นวิธีการทำงานของ ... " ที่มา: https://medium.com/better-programming/sync-vs-async-vs-concurrent-vs-parallel-5754cdb60f66

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


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

1
มันเป็นการอ้างอิงดังนั้นที่มา คำตอบส่วนใหญ่ที่นี่ไม่ได้เขียนโดยเจ้าหน้าที่ในสาขาใดและคำอธิบายที่ผู้เขียนให้นั้นดีพอ
Pedro Boechat

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

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

ปัญหาไม่ใช่ว่า Medium เป็นแหล่งที่ไม่ดี แต่ปัญหาก็คือคำตอบที่เพียงลิงค์ไปยังหน้าภายนอกไม่ใช่คำตอบ คุณสามารถปรับปรุงคำตอบนี้ได้อย่างมากหากคุณทำรายละเอียดในส่วนที่ยกมาหรือสรุปเนื้อหาของบทความมากกว่าเพียงแค่ลิงก์ไปยังคำตอบ
David Schwartz

1

ความสอดคล้อง VS การเปรียบเทียบ: การเกิดพร้อมกัน ณ จุดหนึ่งของเวลาสามารถทำได้เพียงหนึ่งงานเท่านั้น ตัวอย่าง: ซีพียูตัวประมวลผลแบบขนานเดียว ณ จุดหนึ่งเราสามารถทำงานหลายอย่าง ตัวอย่าง: โปรเซสเซอร์ dual-core หรือ multi-core


1

ที่นี่ฉันอธิบายด้วยตัวอย่าง


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

GPUใช้การประมวลผลแบบขนานที่จะดำเนินการบล็อกเดียวกันของรหัส (AKA เคอร์เนล ) ในพันของหัวข้อทางกายภาพและตรรกะ เป็นการดีที่กระบวนการเริ่มต้นและสิ้นสุดสำหรับเธรดทั้งหมดในเวลาเดียวกัน CPU แกนเดียวที่ไม่มีไฮเปอร์เธรดไม่สามารถทำการประมวลผลแบบขนานได้

หมายเหตุ:ฉันพูดอย่างยอดเยี่ยมเพราะเมื่อคุณรันเคอร์เนลที่มีขนาดการโทร 7M บนฮาร์ดแวร์ที่มีเธรด 6M จะต้องรันสองครั้งที่รันโค้ดเดียวกันบนเธรด 6M ทั้งหมดแบบขนานในขณะที่ใช้เธรด 6M ทั้งหมดในแต่ละครั้ง

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

หมายเหตุ: Parallelism ไม่ จำกัด เฉพาะ GPU


เห็นพ้องด้วย

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

แค่คิดว่าผู้ใช้อัปเดตบันทึกและผู้ใช้รายอื่นลบบันทึกเดียวกันในเวลาเดียวกัน

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

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


ไม่ตรงกัน

กระบวนการหนักหนึ่งกระบวนการ (เช่นการดำเนินการ I / O) สามารถบล็อก GUIได้อย่างง่ายดายหากทำงานบนเธรด GUI เพื่อรับประกันการตอบสนองของ UIกระบวนการที่หนักสามารถดำเนินการแบบอะซิงโครนัส มันจะดีกว่าที่จะทำงานที่คล้ายกันดำเนินงาน async หนึ่งที่เวลา เช่นการดำเนินการ IO หลายขอบเขตอาจช้าลงอย่างมากหากทำงานพร้อมกันดังนั้นจึงเป็นการดีกว่าที่จะจัดคิวให้เสร็จ

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

หมายเหตุ:การดำเนินการ async ซึ่งดำเนินการพร้อมกัน (เช่นมากกว่าหนึ่งครั้ง) เป็นการดำเนินการพร้อมกัน


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

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

เช่นในรหัส WPF + C # ด้านล่างawait Task.Run(()=> HeavyMethod(txt))กำลังแก้ปัญหาแบบอะซิงโครนัสในขณะที่ textBox.Dispatcher.Invokeกำลังแก้ปัญหาที่เกิดขึ้นพร้อมกัน:

private async void ButtonClick(object sender, RoutedEventArgs e)
{
    // run a method in another thread
    await Task.Run(()=> HeavyMethod(txt));

    // modify UI object in UI thread
    txt.Text = "done";
}

// This is a thread-safe method. You can run it in any thread
internal void HeavyMethod(TextBox textBox)
{
    while (stillWorking)
    {
        // use Dispatcher to safely invoke UI operations
        textBox.Dispatcher.Invoke(() =>
        {
            // UI operations outside of invoke will cause ThreadException
            textBox.Text += ".";
        });
    }
}

0

ฉันจะทำให้มันสั้นและน่าสนใจที่จะห่อหัวของคุณรอบแนวคิดเหล่านี้

เกิดขึ้นพร้อมกันกับขนาน - งานวิธีที่จะดำเนินการ

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

Parallelismเป็นประเภทของภาวะพร้อมกันที่เฉพาะเจาะจงซึ่งงานจะถูกดำเนินการพร้อมกันจริงๆ ในวิทยาการคอมพิวเตอร์ความเท่าเทียมสามารถเกิดขึ้นได้ในสภาพแวดล้อมแบบมัลติคอร์เท่านั้น

ซิงโครนัส vs. อะซิงโครนัส - โมเดลโปรแกรมมิง

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

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