ความแตกต่างระหว่างอนาคตและสัญญาคืออะไร? (ใน Akka และ Gpars)
พวกเขาดูเหมือนกันทั้งฉันบล็อกและคืนค่าในอนาคตเมื่อได้รับเรียกและสัญญาคือการได้รับผลของอนาคต
ความแตกต่างระหว่างอนาคตและสัญญาคืออะไร? (ใน Akka และ Gpars)
พวกเขาดูเหมือนกันทั้งฉันบล็อกและคืนค่าในอนาคตเมื่อได้รับเรียกและสัญญาคือการได้รับผลของอนาคต
คำตอบ:
ฉันจะพูดคุยเกี่ยวกับ Akka / Scala เพราะฉันไม่คุ้นเคยกับ Gpars หรือกับ Akka / Java
ใน Scala 2.10 ซึ่งรวมถึงส่วนที่เกี่ยวข้องของ Akka ในการแจกแจงแบบมาตรฐาน a Future
นั้นเป็นการอ้างอิงแบบอ่านอย่างเดียวกับค่าที่ยังไม่ได้คำนวณ Promise
เป็นสวยมากเหมือนกันยกเว้นว่าคุณสามารถเขียนให้เป็นอย่างดี กล่าวอีกนัยหนึ่งคุณสามารถอ่านได้จากทั้งFuture
s และPromise
s แต่คุณสามารถเขียนถึงPromise
s เท่านั้น คุณสามารถFuture
เชื่อมโยงกับ a Promise
โดยเรียกใช้future
เมธอดบนมัน แต่ไม่สามารถทำการแปลงในทิศทางอื่นได้ (เพราะมันจะไร้สาระ)
ตามวิกิพีเดียพวกเขาเป็นแนวคิดเดียวกัน:
ในวิทยาการคอมพิวเตอร์อนาคตคำมั่นสัญญาและความล่าช้าหมายถึงโครงสร้างที่ใช้สำหรับการซิงโครไนซ์ในภาษาการเขียนโปรแกรมพร้อมกันบางภาษา พวกเขาอธิบายวัตถุที่ทำหน้าที่เป็นพร็อกซีสำหรับผลลัพธ์ที่ไม่เป็นที่รู้จักในขั้นต้นมักจะเป็นเพราะการคำนวณมูลค่าของมันยังไม่สมบูรณ์
ห้องสมุดบางแห่งอาจเลือกที่จะเรียกพวกเขาทางเดียวบางคนอาจเลือกที่จะเรียกพวกเขาอีกครั้ง และในแต่ละครั้งพวกเขาอาจนำไปใช้ในรสชาติที่แตกต่างกัน ห้องสมุดบางแห่งอาจเลือกใช้คำพ้องความหมายเหล่านี้เพื่อแยกแยะรสชาติที่แตกต่าง ในขณะที่ฉันจะยืนยันว่านี่เป็นตัวเลือกที่ไม่ดี (เพราะเห็นได้ชัดว่ามันทำให้ผู้คนสับสน) ลิงค์นี้แสดงให้เห็นว่าใน Scala การปฏิบัติทั่วไปนี้
Flame ที่ @ Ptharien แนะนำใน Scala a Future
เป็นการดำเนินการแบบอ่านอย่างเดียวในขณะที่ a Promise
ให้ความสามารถในการให้ผลลัพธ์ (หรือล้มเหลว) สำหรับการดำเนินการที่แสดง
Promise
ดังนั้นรหัสA ที่ใช้งานได้ดีที่สุดในการดำเนินการเพื่อเผยแพร่ผลลัพธ์ในขณะที่ a Future
ใช้เพื่อเปิดเผยรหัสลูกค้าซึ่งจะรอผลการค้นหา แต่โปรดทราบว่าความแตกต่างนี้เป็นลักษณะเฉพาะของสกาล่าและอาจสร้างความสับสนให้กับบุคคลภายนอก
ฉันจะเพิ่มนิดหน่อยที่นี่เพราะฉันได้ทำงานกับ Futures ใน Java เป็นจำนวนมาก แต่ก็มีภูมิหลังในการพัฒนา Scala / Akka เช่นกัน คำตอบนี้ส่วนใหญ่จะซ้ำกับสิ่งที่พูด แต่จะชี้ให้เห็นถึงการใช้งานที่เป็นที่นิยมใน JVM ในปัจจุบัน
ขั้นแรกให้ผู้โพสต์ดั้งเดิมกล่าวถึงการใช้และการปิดกั้น - โปรดอย่าทำสิ่งนี้นอกเหนือจากการทดสอบ
เมื่อฉันสอนแนวคิด FP และการเกิดขึ้นพร้อมกันในบทบาทปัจจุบันของฉันฉันบอกนักเรียนก่อนว่าคำสัญญาและฟิวเจอร์สเป็นคำพ้องความหมายเพราะในฐานะผู้บริโภคสัญญาหรือ api ในอนาคตผู้พัฒนาไม่จำเป็นต้องเข้าใจว่ามีหรือหากมี ความแตกต่างทางความหมาย - เฉพาะกลไกสำหรับการจัดการโดยไม่ปิดกั้น IO
หากต้องการกล่าวว่าอนาคตไม่สามารถดำเนินการให้เสร็จสิ้นได้และสัญญาที่ให้ไว้ (เช่นตาม scala / akka / play apis เป็นต้น) นั้นง่ายเกินไป:
ฟิวเจอร์สบางอย่างสามารถเสร็จสิ้น Java8 ตอนนี้แนะนำ CompletableFuture เข้าสู่ห้องสมุดมาตรฐาน
สัญญาบางอย่างไม่สามารถดำเนินการให้สำเร็จได้ เช่นเดียวกันใน API สัญญาของ Play สัญญาจะไม่สามารถสำเร็จได้ แต่ RedeemablePromise สามารถเล่นได้ซึ่งจะนำเสนอความหมายที่แตกต่างกัน - แม้ว่าจะอยู่ภายใต้ร่มของ Typeafe เพิ่มเติม Play API API สามารถแปลงด้วยฟิวเจอร์สสกาล่าทั้งสองทิศทาง - (F.Promise.wrap (อนาคต) หรือ contract.wrapped ()
การทำงานกับเทคโนโลยี Typesafe บน Java8 คุณมักจะกลับไปกลับมาระหว่างฟิวเจอร์ส / สัญญาเพียงเพราะ API หนึ่งดีกว่า (Play Promise API น่าจะดีกว่ากับ Java8 lambdas) ใน Akka + Play + Java8 คุณจะได้รับฟิวเจอร์สจากนักแสดงและห่อไว้ในสัญญาเขียนคำเรียกกลับและส่งคืนจากตัวควบคุม
ดังนั้นเมื่อฉันบอกผู้คนเมื่อฉันสอนคำสัญญาและอนาคตเป็นคำพ้องความหมายไม่มากก็น้อย