Bir Gelecek ile bir söz arasındaki fark nedir? (Akka ve Gpar’larda.)
Bana çağrıldığında çağrının geleceğin değerini hem blok olarak hem de geri getirerek aynı gözüküyorlar ve bir söz geleceğin sonucunu elde etmek.
Bir Gelecek ile bir söz arasındaki fark nedir? (Akka ve Gpar’larda.)
Bana çağrıldığında çağrının geleceğin değerini hem blok olarak hem de geri getirerek aynı gözüküyorlar ve bir söz geleceğin sonucunu elde etmek.
Yanıtlar:
Akka / Scala hakkında konuşacağım, çünkü Gpar’lara ya da Akka / Java’ya aşina değilim.
Standart dağıtımda Akka'nın ilgili bölümünü içeren Scala 2.10'da, Future
esasen henüz hesaplanamayan bir değere salt okunur bir referanstır. A Promise
, aynı şekilde yazabilmeniz dışında hemen hemen aynı . Başka bir deyişle, hem Future
s hem de s'den okuyabilirsiniz Promise
, ancak yalnızca Promise
s'ye yazabilirsiniz . Üzerindeki yöntemi çağırarak Future
bir ile ilişki kurabilirsiniz , ancak diğer yönde dönüşüm mümkün değildir (çünkü saçma sapan olurdu).Promise
future
Wikipedia göre , aynı kavramdır:
Bilgisayar bilimlerinde gelecek, vaat ve gecikme bazı eşzamanlı programlama dillerinde senkronizasyon için kullanılan yapıları ifade eder. Başlangıçta bilinmeyen bir sonuç için vekil olarak hareket eden bir nesneyi, genellikle değerinin hesaplanması henüz tamamlanmadığı için tanımlarlar.
Bazı kütüphaneler onları bir şekilde aramayı seçebilir, bazıları da başka birini aramayı seçebilir. Ve her seferinde farklı tatlarda uygulanabilirler. Bazı kütüphaneler, farklı lezzetleri ayırt etmek için bu eş anlamlıları kullanmayı seçebilir. Bunun kötü bir seçim olduğunu iddia edersem (çünkü açıkça insanları şaşırtıyor), bu bağlantı Scala'da bu ortak uygulamanın olduğunu öne sürüyor.
@ Ptharien'ın Alevinin önerdiği gibi, Scala'da Future
salt okunur bir işlemdir, oysa Promise
size temsil ettiği işlem için bir sonuç (veya başarısızlık) sağlama yeteneği verir.
A Promise
bu nedenle en iyi sonucu yayma işlemini yürütme Future
işleminden sorumlu kod tarafından kullanılırken, a sonuçta bunu bekleyecek olan müşteri koduna maruz kalmak için kullanılır. Fakat yine de, bu ayrımın Scala'ya özgü olduğunu ve yabancıları şaşırtabileceğini lütfen unutmayın.
Buraya biraz ekleyeceğim çünkü geç Java'dan beri bol bol Java ile çalışıyorum ancak Scala / Akka gelişiminde de bir geçmişe sahibim. Bu cevap çoğunlukla söylenenleri çoğaltacaktır ancak bugün JVM'de popüler kullanımdaki uygulamaların bolluğuna işaret edecektir.
İlk olarak, orijinal poster, get ve engellemeyi kullanarak söz eder - lütfen bunu asla testlerin dışında yapmayın.
Mevcut rolümde FP ve Eşzamanlılık kavramlarını öğrettiğimde, öğrenciye öncelikle anlamsal olarak vaat ettiklerini ve geleceklerinin eş anlamlı olduğunu söylüyorum, çünkü bir sözün veya gelecekteki bir apinin tüketicisi olarak, geliştiricinin var olduğunu veya IF'nin var olduğunu anlamalarına gerek yok anlamsal farklar - yalnızca IO'yu engellemeden taşıma yöntemleri.
Bir geleceğin tamamlanamayacağını ve bir söz verebileceğini söylemek (örneğin, scala / akka / play apis'e göre) çok basittir:
Bazı Vadeli İşlemler tamamlanabilir Java8 artık standart kütüphaneye bir CompletableFuture ürününü tanıtıyor.
Bazı Sözler Tamamlanamıyor Benzer şekilde, Oyun söz API'sinde bir Söz yerine getirilemez, ancak bir RedeemablePromise oyun oynayabilir, böylece daha farklı bir anlamsallık ortaya çıkarabilir - Typesafe şemsiyesi altında olsa bile. Ayrıca, Play Promise API, her iki yönde de ölçeklendirme işlemlerini dönüştürebilir - (F.Promise.wrap (future) veya promise.wrapped ()).
Typesafe teknolojisi ile Java8 üzerinde çalışırken, sık sık gelecekler / vaatler arasında gidip gelirsiniz, çünkü bir API tercih edilir (Play Promise API, Java8 lambdas ile daha iyi görünür). Akka + Play + Java8’de, Aktörler’den gelecek işlemleri alıp bunları vaatlere çevirir, geri çağrılar oluşturur ve kontrol cihazından geri gönderirsiniz.
Yani, insanlara öğrettiğimde söylediğim gibi, Sözler ve Gelecekler az çok eş anlamlıdır.