ใช้การตอบสนองจากเป็นนักแสดงในปัจจุบันนักแสดงระบวนการ

0

คำถาม

ฉันสับสนเกี่ยวกับเรื่องที่ฉันควรจะแก้ไขเรื่องนี้อยู่ในสถานการณ์ไม่จอดปิดทางเห็น.

พิจารณาสองคนนักแสดง Actor1 แล้ว Actor2

ภายใน Actor1

Map<Int, Int> foo() {
     List<String> finalList = foo_2();
     Map<Int, Int> finalMap = // do stuff with finalList to get Map<Int, Int>;

     return finalMap;
}

List<String> foo_2() {
    
     CompletableFuture<List<String>> Querylist = ask(Actor2)
     Querylist.get();
     
     return QueryList;
}

ตอนนี้ภายใน foo_2, Querylist.get() เป็นการปิดกั้นโทรมา ฉันต้องแก้ไขเรื่องนี้ในคนที่ไม่ใช่การปิดกั้นเห็น. ฉันสร้างข้อความอะแดปเตอร์สำหรับ Actor2 ข้างใน Actor1 ดังนั้นมีจดหมายนั่น Actor2 ส่งจะถูกจัดการโดย Actor1.

ฉันเคยต่อไปนี้เข้ามาเพื่อแก้ไขรายการปิดกั้นโทรหา

Map<Int, Int> foo() {
     CompletionStage<List<String>> finalList = foo_2();
     finalList.whenComplete(
        // what to do here? 
     )
     // Map<Int, Int> finalMap = // do stuff with finalList to get Map<Int, Int>;

     return finalMap;
}

CompletionStage<List<String>> foo_2() {
    
     CompletionStage<List<String>> Querylist = ask(Actor2)
     
     
     return QueryList;
}

ฉันไม่แน่ใจว่าจะอย่างถูกต้องใช้ CompletionStage สร้างเพื่อให้เหมือนผลลัพธ์ฉันกับจอดปิดทางอนาคต.ได้()โทรมา

2

คำตอบที่ดีที่สุด

1

ถ้าคุณกำลังใช้ Akka พิมพ์(พูดเป็นนักจากป้ายกำกับ),คุณไม่ควรต้องการอนาคตหรือข้อความอะแดปเตอร์ทั้งหมด แค่ใช้ ActorContext.ask.

เห็น เอกสารคู่มือสำหรับการร้องขอ-การตอบสนองกับถามระหว่างสองคนนักแสดง.

Broadly คุณจะกำจัด foo แล้ว foo_2 วิธีการขนย้ายข้อความอะแดปเตอร์คุณตั้งขึ้นไป ActorContext.ask โทรหาและแทนที่โหที่คุณเรียกว่าความเดิมตอนที่แล้ว foo กับโทรศัพท์บอกให้ ActorContext.ask. ถ้าตอบกลับของคุณนักแสดงต้องส่งข้อความที่ซึ่งนำไปสู่คนของขึ้นกับตอบกลับมาถามงั้นก็ดีแล้วซ้อมคือฝันที่ต้องการถานที่ของรัฐเข้าไปในข้อความที่อะแดปเตอร์สร้า.

2021-10-25 00:19:07

ขอบคุณสำหรับคำตอบของคุณนี่คือสิ่งที่ฉันพบว่าฉันทำอะไรอยู่ คุณรู้ว่าอะไรคือความแตกต่างระหว่างทำอะไรอยู่บอก()กับการใช้ ActorContext.ถาม()? มันต่างกันตรงไหนที่คุณผ่าน"เครื่องมือจัดการ"ในข้อบังคับของใน ActorContext.ถาม()?
PyWalker2797

ที่ถามในที่สุดทำที่ทำงานของการจัดการการสิ่งที่ร้องขอมาต้องการ-ตองการโต้ตอบสำหรับคุณมันถูกสร้างขึ้นด้านบนขอบอก(มากกว่าหรือน้อยลงทุกอย่างใน Akka คือหลังจากทั้งหมด). Broadly ถาม spawns เป็นนักแสดงและฉีดเป็นอ้างอิงถึงที่นั่นนักแสดงที่ตอบกลับไปยังที่อยู่ในข้อความที่จะส่งไปถึงนะ ตอนนั้นนักแสดงได้รับข้อความมัน executes รอะแดปเตอร์และเดินหน้าถอยหรพัฒนาเป็นการตอบสนองไปที่นักแสดงซึ่งส่งต้องถามมันนักแสดงยังตามตารางเวลาเพราะฉส่งข้อความให้ตัวเองเพื่อหลังจากที่หมดเวลาหมดอายุซึ่งมัน transforms เข้าไปในหมดเวลากข้อความไว้
Levi Ramsey

เพราะมัน spawns เป็นนักแสดงสำหรับการต้อนรับที่อบกลับ,มันตรวจสอบสามารถน้อยลงมีประสิทธิภาพมากกว่าลงทะเบียนข้อความอะแดปเตอร์,กำลังบอกและการจัดตารางนหมดเวลาส่งข้อความให้ตัวเอง อย่างไรก็ตามคุณสามารถมี arbitrarily หลายคนถามกับต่างออก adapters ในเครื่องบิน:บองบอก+อะแดปเตอร์,คุณอาจจะชอจำกัดของใครอะแดปเตอร์ต่อประเภท(ลงทะเบียนเป็นต่างออกอะแดปเตอร์สำหรับคนเดียวกับประเภทอาจจะเป็นคนที่คาดเดาได้แบบนั้นและมรดกอาจจะเล่นเป็นความเสียหายกับเรื่องนี้เข้ามา). ที่บอก+อะแดปเตอร์เข้าใกล้มันมีประโยชน์ขออนุญาตให้มีหลายตอบกลับ.
Levi Ramsey

ที่บ่อย คุณรู้มั้ยเวลาอย่างน้อยยังไงสำคัญมุมสูงเท่านั้นคือ?
PyWalker2797

คุณสามารถใช้มันช่วยฉันออกไปกับอีกคำถามนึงครับ- stackoverflow.com/questions/69725512/...
PyWalker2797

มุมสูงเท่านั้นคือ negligible:ไม่กี่ร้อยไบต์ของความทรงจำ consumption และอาจจะเป็น microsecond หรือแล้วพิเศษ latency ในการตอบกลับไปที่ asker.
Levi Ramsey
1

คุณสามารถใช้ pipeToSelfดู https://doc.akka.io/docs/akka/current/typed/interaction-patterns.html#send-future-result-to-selfเพื่อส่งผลของคนของนักแสดงตัวมันเอง แทนที่จะพยายามที่จะได้ค่าสำหรับ finalList โดยตรงใน foo()ซึ่งเดียวที่เป็นไปได้กับการปิดกั้น getที่ผลลัพธ์ของ foo()จะถูกส่งไปที่นักแสดงตัวมันเองแล้วซึ่งในกรณีนี้คุณจัดการมันอย่างอื่นข้อความไว้ มันเป็นเรื่องดีซ้อมที่จะสร้างเฉพาะข้อความประเภทสำหรับเรื่องนี้

คุณควรจะดู CompletionStage วิธีการขอ,ที่สำคัญที่สุด thenApply (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html#thenApply-java.util.function.Function-)ซึ่งทำให้มันเป็นไปได้ที่จะเปลี่ยนผลลัพธ์สำหรับตัวอย่างเพื่อสร้าง Map จาก finalListและสำหรับตัวอย่างเช่น MapMessage จาก Map. คุณจะจัดการค MapMessage เหมือนอื่นข้อความในนักแสดง

2021-10-25 00:12:28

สวัสดีขอบคุณสำหรับคำตอบของคุณ ในที่สุดฉันไปกับที่ยอมรับคำตอบตั้งแต่มันดูเหมือนมากก idiomatic.
PyWalker2797

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................