SORU
27 EKİM 2012, CUMARTESİ


Asenkron IO vadeli Scala

Hadi resimler (potansiyel olarak) büyük bir liste, bazı lerini indirmek için alıyorum demek. Scala kullanıyorum, ne yapardım.

import scala.actors.Futures._

// Retrieve URLs from somewhere
val urls: List[String] = ...

// Download image (blocking operation)
val fimages: List[Future[...]] = urls.map (url => future { download url })

// Do something (display) when complete
fimages.foreach (_.foreach (display _))

Km biraz yeniyim, bu hala biraz sihir yapmak gibi görünüyor :

  • Bunu doğru bir şekilde yapmak. Eğer değilse, herhangi bir alternatif?
  • Eğer indirmek için 100 fotoğraf varsa, bu 100 iş parçacığı aynı anda oluşturur, ya da bir iş parçacığı havuzu kullanacak?
  • Son Yönerge (display _) ana iş parçacığında yürütülür, ve değilse, nasıl emin olabilirim?

Tavsiyen için teşekkürler!

CEVAP
27 EKİM 2012, CUMARTESİ


Scala 2.10 Vadeli kullanın. Milano ekibi, Akka takım, ve daha fazla standart gelecek bir API ulaşmak için Twitter ve çerçeveler arasında kullanmak için uygulama ile ortak iş yapıyorlardı. Biz sadece bir kılavuz yayınladı: http://docs.scala-lang.org/overviews/core/futures.html

Ötesinde olmak tamamen engellenmeyen (varsayılan olarak, ama verdiğimiz yapmak için yeteneği yönetilen engelleme işlemleri) ve birleştirilebilir, Scala 2.10 vadeli gelir ile örtülü bir iş parçacığı havuzu için yürütme görevleri yanı sıra bazı kamu hizmetleri için yönetmek zaman çıkışları.

import scala.concurrent.{future, blocking, Future, Await, ExecutionContext.Implicits.global}
import scala.concurrent.duration._

// Retrieve URLs from somewhere
val urls: List[String] = ...

// Download image (blocking operation)
val imagesFuts: List[Future[...]] = urls.map {
  url => future { blocking { download url } }
}

// Do something (display) when complete
val futImages: Future[List[...]] = Future.sequence(imagesFuts)
Await.result(futImages, 10 seconds).foreach(display)

Yukarıda, ilk bir kaç şey alma:

  • future: Bir Gelecek oluşturmak için API.
  • blocking: engelleme yönetilen API.
  • Future: yararlı yöntemleri içeren Gelecekteki arkadaşı nesnekoleksiyonlarıgeleceklerin.
  • Await: singleton nesne bir gelecek üzerine (geçerli iş parçacığı ile sonuç transfer edilmesi için kullanılır.
  • ExecutionContext.Implicits.global: varsayılan genel iş parçacığı havuzu, ForkJoin bir havuz.
  • duration._: bir süre çıkışları için yönetmek süreler için kamu hizmetleri.

imagesFuts büyük ölçüde özgün - biz burada- blocking engelleme yönetilen kullanan tek fark aynı kalır. Kendisine iletmek kod bloğunu çalıştıran uzun veya engelleme işlemleri içeren iş parçacığı havuzu bildirir. Bu havuzun geçici olarak yeni işçiler asla işçilerin tüm engellenmiş olur emin olmak için yumurtlamaya sağlar. Bu uygulamaları engelleme açlık (iş parçacığı havuzu kilitleme) önlemek için yapılır. Not iş parçacığı havuzu da bilir zaman kodu yönetilen bir engelleme blok komple - yani kaldıracaktır yedek iş parçacığı bu noktada, hangi anlamına gelir havuzu olacak küçült geri onun beklenen boyutu.

Eğer kesinlikle hiç oluşturulan ek iş parçacığı önlemek istiyorsanız, o zaman AsyncİO bir kütüphane, Java NİO kütüphane gibi kullanmalısın.)

Koleksiyon Gelecek arkadaşı nesnenin yöntemleri Future[List[...]] List[Future[...]] imagesFuts dönüştürmek için kullanıyoruz.

Await nesne ne kadar garanti display yürütülen iş parçasıyla-- Await.result sadece kuvvetler geçerli iş parçacığı için bekleyin gelecek o geçti tamamlandı. (Bu dahili olarak kullanır engellemeyi başardılar.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • martin shervington

    martin sherv

    7 EKİM 2011
  • placeboing

    placeboing

    7 Mart 2006
  • Tinkernut

    Tinkernut

    28 Aralık 2006