เหตุใดฉันจึงควรรู้โปรแกรมพร้อมกัน


17

การเขียนโปรแกรมพร้อมกันนั้นค่อนข้างยากสำหรับฉัน: แม้แต่การดูสไลด์พื้นฐานก็ดูเหมือนจะท้าทายสำหรับฉัน ดูเหมือนเป็นนามธรรม

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


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

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

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

2
ฉันรู้ว่าการเขียนโปรแกรมพร้อมกัน ฉันสามารถบอกได้ว่าสไลด์ที่คุณให้นั้นไม่ช่วยให้เข้าใจ ให้ไปงานเลี้ยงกับนักปรัชญาด้านอาหารแทน
mouviciel

1
ผ่อนคลายแม้แต่สิ่งที่ยิ่งใหญ่พบว่ามันยาก: informit.com/articles/article.aspx?p=1193856
SK-logic

คำตอบ:


32

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

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

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

บางทีคุณอาจต้องการพัฒนามือถือ เฮ้ iPhone 4S มีซีพียูแบบดูอัลคอร์ ที่เหลือจะไม่ไกลหลัง

วีดีโอเกมส์? Xbox 360 เป็นระบบหลาย CPU และ PS3 ของ Sony เป็นระบบมัลติคอร์

คุณไม่สามารถหลีกเลี่ยงการเขียนโปรแกรมพร้อมกันเว้นแต่คุณกำลังทำงานกับปัญหาเล็ก ๆ ที่เรียบง่าย

อัปเดตในปี 2559 : การทำซ้ำปัจจุบันของ $ 35 Raspberry Pi ถูกสร้างขึ้นรอบ ๆ ระบบ quad-core บนชิปที่ออกแบบมาสำหรับโทรศัพท์มือถือ ความก้าวหน้าอันน่าทึ่งใน AI ได้ถูกสร้างขึ้นบางส่วนเนื่องจากความพร้อมใช้งานของการ์ดกราฟิกคุณภาพสูงเป็นเอนจิ้นการคำนวณแบบขนาน


1
ในขณะที่ฉันเห็นด้วยในหลักการที่จะบอกว่าEverything has a dual-or-more-core-CPU. Except the least expensive machines.ดูเหมือนเล็กน้อยผิดปกติ ผู้คนจำนวนมากมีเครื่องจักรแกนเดียวไม่ใช่เพราะมันราคาถูก แต่เพราะพวกเขามีความสุขกับสิ่งที่พวกเขามีและไม่จำเป็นต้องอัพเกรด ที่กล่าวว่าคิดในแง่ของการทำงานพร้อมกันจะช่วยจัดตารางเวลาในระบบแบบ single-core เช่นกันดังนั้นมันจะไม่สูญเสียความพยายามทุกที่ที่คุณสามารถสันนิษฐานได้ว่าการทำงานแบบ multitasking มาตรการอย่างใดอย่างหนึ่ง (ซึ่งเป็นเกี่ยวกับทุกสภาพแวดล้อมการทำงานแบบ multitasking นักพัฒนาส่วนใหญ่จะเข้ามาติดต่อด้วย วันนี้).
CVn

1
ตกลง - นั่นเป็นการพูดเกินจริงเล็กน้อย แต่ฮาร์ดแวร์ใหม่มีแนวโน้มที่จะเป็นแบบมัลติคอร์อย่างท่วมท้น ฉันไม่เห็นว่าจะไป ดังนั้นหากคุณเป็นนักเรียนในวันนี้ที่คิดเกี่ยวกับงานที่คุณจะทำอย่างมืออาชีพในอนาคตมันปลอดภัยที่จะคิดว่าคุณจะทำงานบนระบบมัลติคอร์
ObscureRobot

ผมสงสัยว่าถ้าผมไม่เห็นด้วยกับคำตอบของคุณมากที่สุดเท่าที่คุณจะไม่เห็นด้วยกับเหมืองฮ่า ๆ ;)

1
วิธีที่ฉันอ่านมันมีเคอร์เนลที่คล้ายคลึงกับสิ่งที่เราทั้งคู่กำลังพูดว่า @ acidzombie24 ฉันกำลังบอกว่าผู้พัฒนาควรรู้วิธีจัดการกับการเกิดพร้อมกันเพราะมันจะอยู่ทุกหนทุกแห่ง คุณจะบอกว่าคุณไม่จำเป็นต้องเป็นสิ่งที่ดีที่การเขียนโปรแกรมพร้อมกันตราบใดที่คุณ ... หลีกเลี่ยงข้อผิดพลาดของระบบที่เกิดขึ้นพร้อมกัน :)
ObscureRobot

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

21

จากตัวประมวลผล 1970 ถึงประมาณ 2002 เพิ่มความเร็วเป็นสองเท่าในทุก ๆ 18 เดือน ดังนั้นในฐานะโปรแกรมเมอร์สิ่งที่คุณต้องทำคือรอและโปรแกรมของคุณจะทำงานได้เร็วขึ้น ปัญหาคือว่าประมาณ 2002 กฎการเปลี่ยนแปลง ตอนนี้พวกเขาไม่ได้สร้างตัวประมวลผลที่เร็วกว่าที่ใหญ่กว่าพวกเขากำลังสร้างตัวประมวลผลที่ช้ากว่าเล็กลง คอมพิวเตอร์ที่ฉันใช้งานอยู่ในขณะนี้มี 4 คอร์และชิปที่มีมากถึง 8 คอร์ (และ 4 เธรดต่อคอร์) ในไม่ช้าเราก็จะมีชิปที่มีคอร์มากขึ้น

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

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

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

วิธีอื่นคือ STM ซึ่งย่อมาจาก Software Transcriptional Memory ซึ่งมีอยู่ใน clojure และ Haskell (และอื่น ๆ ) ในหน่วยความจำ STM มีการแชร์ แต่การเปลี่ยนแปลงสามารถทำได้ผ่านการทำธุรกรรมเท่านั้น ในขณะที่ฐานข้อมูลผู้ใช้ค้นพบสิ่งเหล่านี้ทั้งหมดในปี 1970 มันค่อนข้างง่ายที่จะตรวจสอบให้แน่ใจว่าเราทำให้ถูกต้อง

ที่จริงฉันเข้าใจง่ายกว่าเล็กน้อย Clojure และ Haskell สามารถส่งข้อความได้และ Erlang สามารถทำ STM ได้

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


1
@ Zachary K: มีวิธีการที่ผสมผสานภาษาที่ใช้งานได้กับภาษาท้องถิ่นเพื่อให้ชิ้นส่วนที่ต้องใช้การคำนวณเป็นภาษาแม่ แต่มีส่วนต่อประสานที่เซิร์ฟเวอร์สามารถเขียนด้วยภาษาที่ใช้งานได้หรือไม่
rwong

ไม่แน่ใจ 100% แต่ทั้ง Clojure และ Scala มีอยู่ใน JVM ดังนั้นนั่นคือสิ่งที่ฉันจะเริ่ม อาจดูกรอบ Akka ฉันไม่ได้ใช้มัน แต่ฟังการพูดคุยเกี่ยวกับ Akka สักครู่และดูเหมือนว่ามันอาจจะเท่มาก ตอนนี้ฉันกำลังทำ Erlang และ Javascript ซึ่งใช้เวลาส่วนใหญ่ไป!
Zachary K

1
@rwong:. NET อนุญาตให้โปรแกรมเมอร์ใช้ภาษา C # หรือภาษาอื่นที่ไม่สามารถใช้งานได้สำหรับบางส่วนของแอพและ F # ซึ่งเป็นภาษาที่ใช้งานได้สำหรับผู้อื่น
เควิน

5

เนื่องจากการเกิดขึ้นพร้อมกันสามารถระเบิดในหน้าของคุณเมื่อคุณคาดหวังอย่างน้อย ...


4
+100000000000000000000000000000000000000000000

8
Concurrency เป็น Spanish Inquisition ใหม่ [/ python] [เหมือนใน: ไม่มีใครคาดคิด ... ]
ObscureRobot

1
@ ObscureRobot สองเท่าตลก! (คำอธิบายไม่ต้องการ :-p)
fortran

4

กฎข้อแรกของการเขียนโปรแกรมพร้อมกันคือ "มันยาก" กฎข้อที่สองของการเขียนโปรแกรมพร้อมกันคือ "มันคือ. ยาก" .. !!

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

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

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

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

ทุกวันนี้ภาษาส่วนใหญ่มาพร้อมกับนามธรรมที่เป็นนามธรรมพร้อมกันที่สุดเพื่อทำให้ชีวิตง่ายขึ้นเล็กน้อย ตัวอย่างเช่น. NET 4 มาพร้อมกับTask Parallel Libraryซึ่งทำให้ชีวิตง่ายขึ้นเล็กน้อย ในดินแดน Java พวกเขาได้รับแพ็คเกจConcurrency


1
มันจะได้รับคำสั่งของขนาดถ้าคุณวิ่งหนีจากล็อคเร็วที่สุด ใช้ STM หรือนักแสดงและทุกสิ่งที่คุณพูดหายไป แน่นอนว่าหมายถึงการย้ายออกจาก Java ไปเป็นภาษาต่างๆเช่น Scala, Erlang หรือ Clojure (แม้ว่าฉันจะยืนยันว่านี่เป็นสิ่งที่ดีด้วย)
Zachary K

@ Zachary: มันอาจจะเป็นสิ่งที่ดี แต่ถ้าคุณทำงานในร้าน NET. มันไม่ได้ใช้งานได้จริง STM อาจเป็นตัวเลือกในอนาคต แต่ตอนนี้ไม่ใช่ตัวเลือกในภาษาหลัก
ฌอน

Clojure ทำงานบน. net และมี F # ฉันจะเดิมพันว่ามีการใช้งาน STM สำหรับ C # ด้วย
Zachary K

3

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

ทำงานกับ PHP ฉันทำสิ่งที่ล้าสมัยและเวลาที่ดีที่สุดที่ฉันได้รับหลังจากทำงานสองสามชั่วโมงส่งผลให้~ 120 วินาทีในการทดสอบบางอย่าง (คำขอหลายคำขอ + เครือข่ายล่าช้า + ไม่มี async)

แต่นั่นก็ไม่เพียงพอเมื่อเทียบกับสิ่งที่ฉันต้องการและหลังจากล้มเหลวอย่างน่าสมเพชด้วยการประมวลผลแบบมัลติ PHPs ฉันก็เปลี่ยนมาใช้ Python

หลังจากผ่านไปสองสามชั่วโมงฉันมีสคริปต์การทำงานแบบหลายตัวประมวลผลของ Python ที่รันใน 20 วินาทีและหลังจากนั้นก็เล่นซอกับเวลาและไม่มี หัวข้อที่จะใช้ผมได้รับมันลงไป~ 10 วินาที

นี่เป็นเว็บไซต์ที่เขียนด้วย PHP 100% ยกเว้นสคริปต์ Python 100 บรรทัดเดียว และสิ่งทั้งหมดนั้นทำงานได้อย่างสมบูรณ์แบบ

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

ขอให้โชคดีและมีความสุขการเข้ารหัส!

PS:ฉันไม่ได้พยายามทุบตี PHP แต่ PHP ไม่ใช่เครื่องมือที่เหมาะสมสำหรับงานที่ทำอยู่

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


2

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


-1

เรียนรู้ข้อมูลเชิงลึกของระบบปฏิบัติการ การอ่านซอร์สโค้ดของ schedulers และไดรเวอร์อุปกรณ์จะช่วยได้ พวกเขาพร้อมกันแน่นอน


2
การทำงานพร้อมกันสำหรับโปรแกรมเมอร์มักจะใช้กับโปรแกรมของคุณเองที่ทำงานในหลาย ๆ กรณี

ฉันพยายามเน้นว่าคุณไม่สามารถเขียนโปรแกรมที่เกิดขึ้นพร้อมกันของตัวเองได้โดยไม่ต้องรู้รายละเอียดของอัลกอริทึมการตั้งเวลาของเคอร์เนลระบบปฏิบัติการ
jj1bdx

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