ขอบอกก่อนว่าฉันมีประสบการณ์ Java ค่อนข้างมาก แต่เพิ่งเริ่มสนใจภาษาที่ใช้งานได้ไม่นาน เมื่อเร็ว ๆ นี้ฉันได้เริ่มดู Scala ซึ่งดูเหมือนเป็นภาษาที่ดีมาก
อย่างไรก็ตามฉันได้อ่านเกี่ยวกับกรอบนักแสดงของ Scala ในProgramming ใน Scalaและมีสิ่งหนึ่งที่ฉันไม่เข้าใจ ในบทที่ 30.4 กล่าวว่าการใช้react
แทนreceive
ทำให้สามารถใช้เธรดซ้ำได้ซึ่งดีต่อประสิทธิภาพเนื่องจากเธรดมีราคาแพงใน JVM
นี่หมายความว่าตราบใดที่ฉันจำได้ว่าต้องเรียกreact
แทนreceive
ฉันสามารถเริ่มนักแสดงมากเท่าที่ฉันชอบได้หรือไม่? ก่อนที่จะค้นพบ Scala ฉันเคยเล่นกับ Erlang และผู้เขียนProgramming Erlangภูมิใจนำเสนอเกี่ยวกับการวางไข่กว่า 200,000 กระบวนการโดยไม่ต้องเสียเหงื่อ ฉันไม่อยากทำแบบนั้นกับเธรด Java ฉันกำลังดูข้อ จำกัด ประเภทใดใน Scala เมื่อเทียบกับ Erlang (และ Java)
นอกจากนี้เธรดนี้จะใช้ซ้ำใน Scala ได้อย่างไร สมมติเพื่อความง่ายผมมีด้ายเพียงเส้นเดียว นักแสดงทุกคนที่ฉันเริ่มทำงานตามลำดับในเธรดนี้หรือการสลับงานบางอย่างจะเกิดขึ้น? ตัวอย่างเช่นหากฉันเริ่มต้นนักแสดงสองคนที่ส่งข้อความปิงปองถึงกันฉันจะเสี่ยงต่อการชะงักงันหรือไม่หากพวกเขาเริ่มต้นด้วยเธรดเดียวกัน
ตามที่การเขียนโปรแกรมใน Scalaเขียนนักแสดงที่จะใช้งานยากกว่าด้วยreact
receive
ฟังดูมีความเป็นไปได้เนื่องจากreact
ไม่กลับมา แต่หนังสือเล่มนี้ไปในการแสดงให้เห็นว่าคุณสามารถใส่ภายในห่วงใช้react
Actor.loop
เป็นผลให้คุณได้รับ
loop {
react {
...
}
}
ซึ่งสำหรับฉันดูเหมือนจะค่อนข้างคล้ายกับ
while (true) {
receive {
...
}
}
ซึ่งใช้ก่อนหน้านี้ในหนังสือเล่มนี้ ถึงกระนั้นหนังสือเล่มนี้ยังบอกว่า "ในทางปฏิบัติโปรแกรมจะต้องมีอย่างน้อยสองสามโปรแกรมreceive
" แล้วฉันพลาดอะไรที่นี่? สิ่งที่receive
ทำreact
ไม่ได้นอกจากกลับมา แล้วฉันจะแคร์ทำไม?
ในที่สุดก็มาถึงหัวใจหลักของสิ่งที่ฉันไม่เข้าใจ: หนังสือเล่มนี้ยังคงกล่าวถึงวิธีการใช้ที่react
ทำให้สามารถทิ้ง call stack เพื่อใช้เธรดซ้ำได้ ทำงานอย่างไร? เหตุใดจึงจำเป็นต้องทิ้ง call stack? และเหตุใด call stack จึงสามารถละทิ้งได้เมื่อฟังก์ชันสิ้นสุดโดยการทิ้งข้อยกเว้น ( react
) แต่ไม่ใช่เมื่อสิ้นสุดโดยการส่งคืน ( receive
)
ฉันรู้สึกว่าการเขียนโปรแกรมใน Scalaได้รับการแก้ไขปัญหาสำคัญบางประการที่นี่ซึ่งเป็นเรื่องที่น่าเสียดายเพราะอย่างอื่นมันเป็นหนังสือที่ยอดเยี่ยมอย่างแท้จริง