ความแตกต่างระหว่างอนาคตและสัญญาคืออะไร?


73

ความแตกต่างระหว่างอนาคตและสัญญาคืออะไร? (ใน Akka และ Gpars)

พวกเขาดูเหมือนกันทั้งฉันบล็อกและคืนค่าในอนาคตเมื่อได้รับเรียกและสัญญาคือการได้รับผลของอนาคต


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

การบรรยายที่ยอดเยี่ยมเกี่ยวกับอนาคต / สัญญาเกี่ยวกับหลักสูตร "หลักการเขียนโปรแกรมเชิงโต้ตอบ" โดย Martin Odersky, Erik Meijer, Roland Kuhn: class.coursera.org/reactive-001/lecture , สัปดาห์ที่ 3
GKislin

@rwong: "อนาคตสัญญากับผู้ผลิตโปรดิวเซอร์" - เหรอ? นี่หมายความว่าเป็นประโยคที่มีความหมายที่ทำหน้าที่ช่วยในการจำเพื่อเตือนเราถึงความแตกต่างระหว่างฟิวเจอร์สและสัญญาหรือไม่? สมองของฉันไม่สามารถแยกวิเคราะห์ได้ทั้งหมด และคุณกำลังบอกว่ามันผิดและต้องการการแลกเปลี่ยนคำ แต่ด้วยเหตุผลบางประการคุณไม่ได้ทำสิ่งนี้ก่อนพิมพ์ และในที่สุดมันก็อยู่ในเครื่องหมายคำพูด แต่ googling มันก็ไม่ได้ฮิตอะไรนอกจากความคิดเห็นของคุณ เมกะงงงัน
บาคาร่า

คำตอบ:


54

ฉันจะพูดคุยเกี่ยวกับ Akka / Scala เพราะฉันไม่คุ้นเคยกับ Gpars หรือกับ Akka / Java

ใน Scala 2.10 ซึ่งรวมถึงส่วนที่เกี่ยวข้องของ Akka ในการแจกแจงแบบมาตรฐาน a Futureนั้นเป็นการอ้างอิงแบบอ่านอย่างเดียวกับค่าที่ยังไม่ได้คำนวณ Promiseเป็นสวยมากเหมือนกันยกเว้นว่าคุณสามารถเขียนให้เป็นอย่างดี กล่าวอีกนัยหนึ่งคุณสามารถอ่านได้จากทั้งFutures และPromises แต่คุณสามารถเขียนถึงPromises เท่านั้น คุณสามารถFutureเชื่อมโยงกับ a Promiseโดยเรียกใช้futureเมธอดบนมัน แต่ไม่สามารถทำการแปลงในทิศทางอื่นได้ (เพราะมันจะไร้สาระ)


3
ที่เกี่ยวข้อง: stackoverflow.com/questions/13381134/…
rwong

19

ตามวิกิพีเดียพวกเขาเป็นแนวคิดเดียวกัน:

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

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

Flame ที่ @ Ptharien แนะนำใน Scala a Futureเป็นการดำเนินการแบบอ่านอย่างเดียวในขณะที่ a Promiseให้ความสามารถในการให้ผลลัพธ์ (หรือล้มเหลว) สำหรับการดำเนินการที่แสดง

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


นี่เป็นกรณีสำหรับ JS Promises และ Python Futures เช่นกัน
Nick Sweeting

6

ฉันจะเพิ่มนิดหน่อยที่นี่เพราะฉันได้ทำงานกับ 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 คุณจะได้รับฟิวเจอร์สจากนักแสดงและห่อไว้ในสัญญาเขียนคำเรียกกลับและส่งคืนจากตัวควบคุม

ดังนั้นเมื่อฉันบอกผู้คนเมื่อฉันสอนคำสัญญาและอนาคตเป็นคำพ้องความหมายไม่มากก็น้อย

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