นักแสดงทำงานอย่างไรเมื่อเทียบกับเธรด


88

มีคำอธิบายที่ดีและสั้น ๆ เกี่ยวกับการทำงานของนักแสดงเมื่อเทียบกับเธรดหรือไม่?

ไม่สามารถมองเห็นเธรดในฐานะนักแสดงและส่งข้อความไปยังเธรดอื่นได้หรือไม่? ฉันเห็นความแตกต่างบางอย่าง แต่ก็ไม่ชัดเจนสำหรับฉัน ฉันสามารถใช้นักแสดงในภาษาใดก็ได้โดยใช้เธรดที่แตกต่างกันหรือไม่

คำตอบ:


78

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

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

ไม่สามารถมองเห็นเธรดในฐานะนักแสดงและส่งข้อความไปยังเธรดอื่นได้หรือไม่?

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

ฉันสามารถใช้ Actor Model ในภาษาใดก็ได้โดยใช้เธรดที่แตกต่างกันหรือไม่

ใช่ แต่จะต้องใช้เวลาอีกสักหน่อย ภาษาโปรดของคุณอาจมีไลบรารีการส่งข้อความดังนั้นจึงเป็นสิ่งแรกที่ต้องตรวจสอบ นอกจากนี้คุณควรตรวจสอบการใช้โครงสร้างข้อมูลที่ไม่เปลี่ยนรูป โปรดสังเกตว่าหากโครงสร้างข้อมูลไม่เปลี่ยนรูปแสดงว่าคุณได้จัดการกับปัญหา "สภาวะที่ใช้ร่วมกัน" เป็นหลัก - เธรดหลายเธรดสามารถเก็บข้อมูลอ้างอิงไปยังข้อมูลที่ไม่เปลี่ยนรูปได้โดยไม่มีสิ่งที่ไม่ดีเกิดขึ้น มีเหตุผลที่ภาษาของนักแสดงมักจะเป็นภาษาที่ใช้งานได้ (erlang, scala)

คุณอาจต้องการดู Software Transactional Memory ซึ่งเป็นรูปแบบที่แตกต่าง แต่น่าสนใจเช่นกัน Clojure เป็นตัวอย่างที่ฉันชอบมาก


3
ยิ่งฉันใช้แบบจำลองการทำงานพร้อมกันที่ส่งผ่านข้อความแบบอะซิงโครนัส (เช่นนักแสดงหรือ async / await) มากเท่าไหร่ฉันก็ยิ่งคิดว่ามันเป็นเพียงรูปแบบการปิดกั้นพร้อมกันแบบมาตรฐานแบบคู่ การส่งข้อความแบบอะซิงโครนัสไม่ใช่เรื่องง่ายหรือยากไปกว่าการใช้การล็อกและจอภาพ แท้จริงแล้วไม่มีสถานะที่เปลี่ยนแปลงร่วมกันได้ แต่เฉพาะในระดับนักแสดงคนเดียวเท่านั้น แต่นักแสดงยังคงมีสถานะที่ไม่แน่นอนและเป็นที่สังเกตได้จากนักแสดงทุกคนที่ร่วมมือกับมัน ดังนั้นคุณอาจมีปัญหาเดียวกันทั้งหมด: การหยุดชะงักการหยุดชะงักความอดอยากสภาพการแข่งขัน ฯลฯ
Piotr Kołaczkowski

2

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

JActor (ไลบรารี Java) ยังไม่ใช้การล็อก โครงสร้างข้อมูลแบบปรมาณูและข้อมูลพร้อมกันเพียงบางส่วนเท่านั้นโดยมีเซมาโฟร์ไม่กี่ตัวส่งผ่านข้อความประมาณ. 8 พันล้านข้อความต่อวินาที

https://github.com/laforge49/JActor


2
โมเดลนักแสดงถูกกำหนดโดยใช้การสื่อสารแบบอะซิงโครนัสเท่านั้น ( en.wikipedia.org/wiki/Actor_model ) ถ้า JActor ไม่ทำแบบนั้นแสดงว่าไม่ใช่แค่นางแบบนักแสดง 100% อาจใช้โมเดลนักแสดงเป็นหนึ่งในหลาย ๆ คุณสมบัติ
BT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.