2012-09-13 26 views
5

Bir sunucunun ana döngüsünü, heterojen bir dizi olayda beklemesi gereken genel olarak kabul edilen yol nedir? Varolan soket üzerindeHaskell'de ana sunucu döngüsünü uygulayın?

  • yeni soket bağlantısı
  • veriler
  • OS sinyali
  • üçüncü taraf kütüphane geri aramaları
  • : Bu sunucu aşağıdakilerden biri gerçekleşene kadar (busywait değil) beklemeli miyim

cevap

6

Tek bir iş parçacığı, kilitlenmeyen I/O ve bir select() çağrısı ile bir C paradigması düşünmeyi düşünüyorum.

Sen Haskell böyle bir şey yazmak için yönetebilirsiniz, ancak Haskell sunmak için çok daha fazlasına sahiptir:

Her ayrı temas noktası için yeni bir iş parçacığı çatallamanızı öneririm dış dünyayı ve STM ile koordine edilmiş her şeyi tutun. Ben yapmak istiyorum

2

Konular arasında senkronize etmek için takeMVar ve putMVar kullanın. Operasyona izin verilmezse genellikle dişi bloke ederler. ghc docs'u okuyun.

+1

Ya 'Chan'. Chan'ı gerçekten çok seviyorum. – singpolyma

1

açıkça ben ilk yayınlanmıştır iki çözüm var belirli sorun için bundan daha iyi olduğunu düşünüyorum, ancak burada sunulan sorunun türünü çözmek için bir yoldur.

Bu turda basit bir yolu Dediğim gibi, diğer yanıtlara okumak

data SocketConn = .... 
data DataAvail = ... 
data OSSignal = ... 
data Callback = ... 

gibi tanımları alıp

data ServerEvent = Sok SocketConn | Dat DataAvail | Sig OSSignal | Call Callback 

handleEvent :: ServerEvent -> IO() 
handleEvent (Soc s) = .... 
handleEvent (Dat d) = .... 
handleEvent (Sig o) = .... 
handleEvent (Call c) = .... 

ait Sadeleştirilmemiş versiyonunu tanımlamaktır!

+1

Bu cevabı çok fazla düşünmemelisiniz; Bir şeyler yapmak için meşru bir yol. Ve * temel sorulan soruya * cevap veriyor, yani "hepsi aynı yuvaya giren farklı giriş şekillerinin olasılığını nasıl ele alıyor?" Cevap, önerdiğiniz gibi "etiketli bir birlik kullanın". –

+0

@DanBurton Tamam, ben aşağı tonda ettik "yapmayın bu" "diğer çözümleri specitic sorun için daha iyi" – AndrewC

0

Yazılım İşlemsel Bellek (STM) çok yönlü beklemenin yapılmasının ana yoludur.

Ancak şeyler görünüyor, sizin durumunuzda muhtemelen sadece her görev için ayrı Haskell parçacığı spawn ve oluyor hiçbir şey yok iken her tür iplik bloğunu izin vermek istiyorum.

bin bir işletim sistemi konuları oluşturmak istemem ama binlerce Haskell ipler hiç sorun değildir.

(bu iplikler zaman zaman koordine etmek gerekirse, sonra tekrar, STM muhtemelen bunu en basit, en güvenilir yoldur.)