2013-08-08 20 views
13

Haskell Handles kullanırken biraz güvensiz hissettim. Yani, iki özellik arıyorum (belki zaten oradalar ve bu durumda lütfen cehaletimi bağışlayınız). Ben (örneğin Network.accept tarafından döndürülen) okunabilir ve yazılabilir hem olan, ben bir çift dönüştürmek isteyen bir kolu elde ettikHaskell'de Daha Güvenli Kulplar?

  1. salt okunur ve salt salt okunur bir tanıtıcısına yazma işleminin, yazmayı ve tersini yazmaz. (Belki bir IO fonksiyonları etrafında bu kullanarak hayali türleri ve sargıları elde edebilirsiniz?) Eşzamanlı ortamda
  2. , ben yol açmaktadır aynı sap, yazma birden çok iş parçacığı için mümkün olduğu saptanmıştır oldukça kötü sonuçlara yol . Bir tür sistem aracılığıyla (eğer mümkünse) ya da en azından çalışma zamanı sırasında atılan istisna yoluyla bu durumun bildirilmesini nasıl önleyebiliriz?

Herhangi bir fikir kabul edilir.

cevap

2

network conduit paketini kullanmayı düşünebilirsiniz.

type Application m = AppData m -> m() 

data AppData m Source -- ... 
appSource :: AppData m -> Source m ByteStringSource 
appSink :: AppData m -> Sink ByteString m() 

Bu temiz yazma ve okuma parçasını ayırır: Bir lavabo prize veri iter ve yuva veri okur tek bir kaynaktan - İki "son noktalarını" verilir şey olarak bir ağ uygulama açıklanır. Şimdi böyle bir kaynak ve bir lavabo ile istediğiniz her şeyi yapabilir, hatta her birini farklı bir dişe ve işleme giriş ve çıkışını ayrı ayrı geçirebilirsiniz. Tabii ki, her biri ona hangi son noktayı verdiğinize bağlı olarak sadece okuyabilir veya yazabilir.

Tek iş parçacıklı işlemeyi zorlamak istiyorsanız, program bileşenlerinizi Conduit ByteString m ByteString olarak uygulamak için kendinizi kısıtlayabilirsiniz. Aksi kolları her türlü erişimi yoktur ve asla onun uç noktalarının herhangi görür Böyle bir kanal aseily

asApp :: MonadIO m => Conduit ByteString m ByteString -> Application m 
asApp cond ad = appSource ad $= cond $$ appSink ad 

gibi bir Application s dönüştürülebilir Ama bir kanal sadece veri await kullanarak ve yield kullanarak çıktı yazmak isteyebilir bu yüzden onları hiçbir yere gösteremez veya sızdıramaz.

8

safer-file-handles kütüphanesi ne istersen onu yapıyormuş gibi görünüyor. İlk kısım oldukça net bir şekilde ele alındı. Eşzamanlılık güvenliği RegionT tarafından regions kitaplığından işleniyor gibi görünüyor. Bunu hiç kullanmadım ama oldukça yaygın bir yaklaşım gibi görünüyor.