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.
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.
Jawaban:
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 Future
pada dasarnya adalah referensi hanya baca untuk nilai yang belum dihitung. A Promise
adalah hampir sama kecuali bahwa Anda dapat menulisnya juga . Dengan kata lain, Anda dapat membaca dari Future
s dan Promise
s, tetapi Anda hanya dapat menulis ke Promise
s. Anda bisa mendapatkan yang Future
terkait dengan Promise
memanggil future
metode di atasnya, tetapi konversi di arah lain tidak mungkin (karena itu akan menjadi tidak masuk akal).
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 Future
adalah operasi read-only, sementara a Promise
memberi Anda kemampuan untuk menghasilkan hasil (atau kegagalan) untuk operasi yang diwakilinya.
Jadi, A Promise
terbaik digunakan oleh kode yang bertanggung jawab untuk melakukan operasi untuk menyebarkan hasilnya, sementara a Future
digunakan 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.
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.