2013-08-01 23 views
5

İşlevlerinin bir parçası olarak HTTP istekleri yapan bir kitaplık yapıyorum. Birden fazla ortamda çalışmasını sağlamak için, Futures ile veya Futures olmadan çalışabilmeyi isterdim.Senkronize Scala Ayrı iş parçacığı olmadan gelecek

Bir seçenek kütüphanenin yanıt türünü parametrelendirmesini sağlamaktır; bu nedenle, eşzamanlı olmayan bir HTTP uygulaması kullanıp kullanmadığınıza bağlı olarak, Future türünde bir kitaplık örneği oluşturabilir veya türünde bir örnek oluşturabilirsiniz. (Id bir Kimlik monadı olabilir - kullanıcılara tutarlı bir arabirim açığa çıkarmaya yetecek kadar)

Bu yaklaşıma başladım, ancak karmaşıklığı var. Bunun yerine yapmak istediğim şey, Gelecek türünü her yerde kullanmak, gerektiğinde bir Gelecekte senkronize yanıtları kutlamak. Ancak, Vadeli İşlemleri kullanmanın her zaman bir çeşit iplikçiği kapsayacağını biliyorum. Bu, örn. AppEngine (gerekli bir ortam).

Geçerli iş parçacığı üzerinde yürütülecek bir değerden Gelecek oluşturmak için bir yol var mıdır ve bu nedenle iş parçacığı oluşturmanın mümkün olmadığı ortamlarda sorun yaratmaz mı?

(ps ek bir gereksinim olarak, ben scala.concurrent bulunan özellikleri sınırlayabilir olabilir geri Scala V2.9.1 için kütüphane kurmaya geçmeye gerekiyor) Sana isteyen anladığım

+1

'Gelecek bir değerden Gelecek oluşturmak için bir yol var mı Şu andaki iş parçacığı üzerinde çalıştırılmalı 'Neden bir gelecek kullanın? – Jatin

+0

Açıkladığım gibi, uygulamalarda tutarlı bir dönüş türü oluşturmak için – adamnfish

+1

Soruyu anlamak için üzgünüm. Eğer sonucun nihai değerine sahip olduğunuzu ve bunun için gelecekteki bir sarıcıya ihtiyacınız olduğunu düşünüyorsanız, o zaman bir 'Promise' kullanmaya ne dersiniz? – Jatin

cevap

3

Bir şey yürüt ve sonra sonucu Future ile sar. Bu durumda, her zaman

val p = Promise[Int] 
p success 42 
val f = p.future 

Promise Dolayısıyla şimdi 42

Promise çok iyi here açıklanmıştır nihai değer içeren bir future sarmalayıcı var kullanabilirsiniz.

+0

Ah, elbette, teşekkürler! Fantastik bağlantı da. Sorun şu ki hala bir ExecutionContxt (örtülü veya başka bir şekilde) sağlamanız gerekiyor. Sağlanan ExecutionContext'in bu Promise yaklaşımıyla gerçekten kullanılsa da, her iki durumda da açık değildir. Bu, Java'da kontrol edilen istisnalar gibi sona eriyor ve bağlam, geleceği tüketen uygulama ile tümüyle dahil edilmek zorunda. – adamnfish

+3

Ayrıca, Promise nesnesi bunu biraz daha özlü bir şekilde yapmak için bir yöntem içerir: 'Promise.successful (42) .future'. – adamnfish

+0

@adamnfish Yukarıdaki kod için ExecutionContext'e ihtiyacınız yoktur. Herhangi bir geleceği herhangi bir yerde teslim etmiyoruz. Bence yanılıyorsun. Sadece bir 'import scala.concurrent._' yeterli olacaktır. Ayrıca cevabı kabul ederseniz lütfen cevabı kabul edin :) – Jatin

1

Gelecekteki özelliklerin Scalaz sürümüne bir look atın. fork veya apply tüm ExecutionContext içe aktarmalarını tamamen kaldırmayacaksa, şu anki iş parçacığı tarafından yürütülecek olan Trampoline mekanizmasının üstüne dayanıyor =)

+0

Çok ilginç bir yaklaşım, çok teşekkürler. Scalaz içermemeyi tercih ediyorum (özellikle en son sürüm 2.9.1'e çapraz olarak geçmediğinden), ancak ExecutionContext içe aktarma işlemleriyle uğraşmak çok kullanışlı olacaktır. – adamnfish

İlgili konular