使用此驱动程序:
https://github.com/TonyGen/mongoDB-haskell
我无法关闭MongoDB的管道(连接)。我实际上可以做其他事情,比如成功地将东西插入数据库,之后我就无法关闭管道。
我想确认或否认问题是否是驱动程序本身。有人可以确认/否认吗?
我使用以下代码:
{-# LANGUAGE OverloadedStrings, ExtendedDefaultRules #-}
import Database.MongoDB
import Control.Monad.Trans (liftIO)
main = do
pipe <- runIOE $ connect (host "127.0.0.1")
close pipe
更新:要回答几个问题,在运行代码之后它只是坐在那里(锁定)。冻结发生在“关闭管道”声明中。它永远不会从那个命令返回,无论我让它坐在那里多久,除非我CTRL-C出来,否则我什么也做不了。
我希望其他人使用相同的驱动程序来运行此代码并告诉我会发生什么。
答案 0 :(得分:0)
来自消息来源
hGetN :: Handle -> Int -> IO ByteString
-- ^ Read N bytes from hande, blocking until all N bytes are read. If EOF is reached before N bytes then raise EOF exception.
hGetN h n = assert (n >= 0) $ do
bytes <- hGet h n
let x = fromEnum $ S.length bytes
if x >= n then return bytes
else if x == 0 then ioError (mkIOError eofErrorType "hGetN" (Just h) Nothing)
else S.append bytes <$> hGetN h (n - x)
所以如果看一下我的旧帖子Howto kill a thread in Haskell,我认为管道监听线程很可能“卡在”hGet上,等待更多数据。
有几种方法可以解决这个问题,但我认为驱动程序基本上做错了。 即必须从辅助线程中关闭套接字。