2017-01-13 47 views
7

network kitaplığındaki bir tasarım kararını daha iyi anlamaya çalışıyorum. Saygın kaynaklar, a github issue ve mailing list response numaralı telefonlarda network'un bloke olmayan soketler kullanmasından bahsetmektedir. Varsayılan engelleme davranışını kullanmak yerine, soket okunmaya hazır olana kadar bloklamak için select kullanın. Bu neden daha iyi? Her iki durumda da engelleme sona erer ve network sadece son kullanıcılara bir engelleme API'si sunar. Tahminimce bir FFI çağrısının engellenmesi ve select civarında bir çeşit GHC büyüsü olması kötü bir şeydir, ancak bunu doğrulayamadım.Neden haskell'in ağ kitaplığı engelleme olmayan soketleri kullanır?

Kük bir kenara göre, 'un network içinde aranan yerini bulamıyorum. Kod tabanını kırmak bir şey ortaya atmadı. Ben sadece, select doğrudan aramak yerine kullanılabilecek işlevleri sağlamak gibi görünüyor GHC.Event, keşfettim ama grepping gösterir network da bunu kullanmaz.

+1

ghc çalışma zamanı sisteminde bir yer (veya anket) döngüsü bulunmalıdır. Genel olarak, ghc, her yerde engellemeyen G/Ç kullanmayı dener. – melpomene

+0

Bu _guess_, bunun GHCs yeşil iş parçacığı zamanlayıcı için (muhtemelen) başka bir iş parçacığına denetim vermesi için bir 'verim' noktası olarak kullanılmasını isterim? Gerçekten de bilmiyorum. – Cubic

cevap

7

Bloke olmayan IO olay döngüsü, GHC'nin çalışma zamanı sisteminin (RTS) bir parçasıdır. Bu, GHC'nin yeşil iplik sistemi ile çok iyi etkileşime girer: asenkron kod yazmak yerine, hafif iplikleri kullanabilirsiniz ve çalışma zamanı doğru olanı uyandırmaya çalışır.

Haskell'deki tüm IO'lar öntanımlı olarak engellenmez. Bu nedenle, her biri farklı bir yuvada engellenen iki iş parçacığınız varsa, çalışma zamanı sistemi dahili olarak select (veya başka bir platforma özgü diğer yoldan Dosya tanıtıcısı hazır olduğunda, iş parçacığı yalnızca uyanmak için epoll veya kqueue gibi birden çok dosya tanıtıcısını bekle. Daha fazla bilgi için https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/IOManager'a bakın.

+0

Eğer 'network', 'select' yerine 'epoll' güvendiyse bu modele daha iyi uymaz mıydı? – sapanoia

+2

O linux üzerinde epoll kullanır acutally kullanıyor olabilir, bu durumda olduğunu düşünüyorum. @sapanoia bkz http://stackoverflow.com/a/39106000/2494803 – bennofs