簡體   English   中英

Haskell並發和處理

[英]Haskell concurrency and Handles

我正在編寫一個小的通知服務器以將數據推送到客戶端。 基本架構看起來像這樣(簡化后的偽代碼):

acceptConnections sock = forever $ do
    connection <- accept sock
    forkIO (handleConnection connection)

handleConnection connection = do
    connectionHandle <- socketToHandle connection ReadWriteMode
    handleMessage connectionHandle
    hClose connectionHandle

handleMessage connectionHandle = forever $ do
    message <- hGetLine connectionHandle 
    if shouldPushMessage message
        then hPutStrLn targetConnection message
        else return () 

其中targetConnection(在handleMessage中)來自單獨的連接,並且將handleMessage掛在另一個線程中,等待其緩沖區被填充。 我認為這會引起問題,因為我有2個線程訪問相同的Handle。 所以,我的問題是,為什么這不是問題? 還是它,而我只是還沒有看到它變成一個問題? 在我的實際應用程序中,當我抓住targetConnection時,我是通過通過MVar訪問的地圖來完成的,但是在hGetLine調用中並不能安全地訪問它。

免責聲明:我是完整的Haskell和多線程newb

感謝您的任何解釋/見解!

在GHC中實現的 Handle已經是包裝在底層IODevice上的MVar。 我不太了解您在做什么(不是說不清楚,我病了,所以也許我很慢),但我猜想在Handle線程安全處理中內置的GHC可以為您省錢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM