Apa perbedaan antara Masa Depan dan Janji?

73

Apa perbedaan antara Masa Depan dan janji? (Dalam Akka dan Gpars.)

Mereka tampak sama bagi saya sebagai keduanya menghalangi dan mengembalikan nilai masa depan ketika mendapatkan dipanggil dan janji adalah untuk mendapatkan hasil masa depan.

Suminda Sirinath S. Dharmasena
sumber
4
"Masa depan menjanjikan konsumen produsen". (Tetapi untuk pemrograman, tukar dua yang terakhir karena Futures (nol atau lebih) adalah analog dengan konsumsi nilai, dan Janji (dengan hanya yang pertama yang berhasil) analog dengan menghasilkan nilai.)
rwong
Ceramah luar biasa tentang masa depan / janji tentang coursera "Principles of Reactive Programming" oleh Martin Odersky, Erik Meijer, Roland Kuhn: class.coursera.org/reactive-001/lecture , Minggu 3
GKislin
@rwong: "Masa depan menjanjikan konsumen produsen" - ya? Apakah ini dimaksudkan sebagai kalimat bermakna yang bertindak sebagai mnemonik untuk mengingatkan kita tentang perbedaan antara masa depan dan janji? Otak saya benar-benar gagal menguraikannya. Dan juga Anda mengatakan bahwa itu salah dan perlu kata-kata bertukar, tetapi untuk beberapa alasan Anda belum melakukan ini sebelum mengetiknya. Dan akhirnya ada dalam tanda kutip, tetapi googling tidak memunculkan hits selain komentar Anda. Bingung besar.
bacar

Jawaban:

54

Saya akan berbicara tentang Akka / Scala, karena saya tidak terbiasa dengan Gpars atau Akka / Java.

Dalam Scala 2.10, yang mencakup bagian Akka yang relevan dalam distribusi standar, a Futurepada dasarnya adalah referensi hanya baca untuk nilai yang belum dihitung. A Promiseadalah hampir sama kecuali bahwa Anda dapat menulisnya juga . Dengan kata lain, Anda dapat membaca dari Futures dan Promises, tetapi Anda hanya dapat menulis ke Promises. Anda bisa mendapatkan yang Futureterkait dengan Promisememanggil futuremetode di atasnya, tetapi konversi di arah lain tidak mungkin (karena itu akan menjadi tidak masuk akal).

Api Ptharien
sumber
19

Menurut wikipedia , mereka adalah konsep yang sama:

Dalam ilmu komputer, masa depan, janji, dan keterlambatan merujuk pada konstruksi yang digunakan untuk menyinkronkan dalam beberapa bahasa pemrograman bersamaan. Mereka menggambarkan objek yang bertindak sebagai proksi untuk hasil yang awalnya tidak diketahui, biasanya karena perhitungan nilainya belum lengkap.

Beberapa perpustakaan dapat memilih untuk memanggilnya dengan satu cara, beberapa perpustakaan mungkin memilih untuk memanggilnya dengan cara lain. Dan setiap kali, mereka dapat diimplementasikan dalam rasa yang berbeda. Beberapa perpustakaan mungkin memilih untuk menggunakan sinonim ini untuk membedakan rasa yang berbeda. Sementara saya berpendapat bahwa ini adalah pilihan yang buruk (karena ternyata itu membingungkan orang), tautan ini menunjukkan bahwa dalam Scala praktik umum ini.

Seperti yang disarankan oleh @ Ptharien Flame, dalam Scala a Futureadalah operasi read-only, sementara a Promisememberi Anda kemampuan untuk menghasilkan hasil (atau kegagalan) untuk operasi yang diwakilinya.

Jadi, A Promiseterbaik digunakan oleh kode yang bertanggung jawab untuk melakukan operasi untuk menyebarkan hasilnya, sementara a Futuredigunakan untuk mengeksposnya ke kode klien, yang pada gilirannya akan menunggu hasilnya. Tetapi sekali lagi, harap dicatat bahwa perbedaan ini khusus untuk Scala dan dapat membingungkan orang luar.

back2dos
sumber
Ini adalah kasus untuk JS Promises dan Python Futures juga.
Nick Sweeting
6

Saya akan menambahkan sedikit di sini karena saya telah bekerja dengan kebanyakan Futures di Jawa akhir-akhir ini tetapi memiliki latar belakang dalam pengembangan Scala / Akka juga. Jawaban ini sebagian besar akan menduplikasi apa yang telah dikatakan tetapi akan menunjukkan sejumlah besar implementasi yang populer saat ini di JVM.

Pertama, poster asli menyebutkan penggunaan dan pemblokiran - tolong jangan pernah melakukan ini di luar tes.

Ketika saya mengajarkan konsep FP dan Concurrency dalam peran saya saat ini, saya pertama-tama memberi tahu siswa itu bahwa secara semantik janji dan masa depan adalah sinonim karena sebagai konsumen janji atau api masa depan, pengembang tidak perlu memahami bahwa ada atau JIKA ada perbedaan semantik - hanya mekanisme untuk menanganinya tanpa menghalangi IO.

Untuk mengatakan bahwa masa depan tidak dapat diselesaikan dan bahwa janji dapat (misalnya sesuai scala / akka / play apis misalnya) terlalu sederhana:

Beberapa Futures dapat diselesaikan Java8 sekarang memperkenalkan CompletableFuture ke pustaka standar.

Beberapa Janji tidak dapat diselesaikan. Demikian pula, dalam API Play, Janji tidak dapat dipenuhi tetapi RedeemablePromise bisa bermain memperkenalkan semantik yang berbeda - bahkan saat berada di bawah payung Typesafe. Selanjutnya, Play berjanji API dapat mengkonversi dengan scala futures di kedua arah - (F.Promise.wrap (masa depan) atau janji.wrapped ()).

Bekerja dengan teknologi Typesafe di Java8 Anda akan sering bolak-balik antara masa depan / janji hanya karena satu API lebih disukai (Play Promise API tampaknya lebih baik dengan lamb8 Java8). Pada Akka + Play + Java8 Anda akan mengambil masa depan dari Aktor dan membungkusnya menjadi janji-janji, menyusun panggilan balik, dan mengembalikannya dari controller.

Jadi, ketika saya memberi tahu orang-orang ketika saya mengajar, Janji dan Berjangka sedikit banyak adalah sinonim.

JasonG
sumber