我试图理解以下代码(取自https://github.com/zadarnowski/postgresql-wire-protocol)异步发送和接收PSQL有线协议消息。我想知道如何以及何时有这种异步发送和接收的概念是有用的。如果我在单独的线程上获得响应,我如何知道任何给定响应属于哪个请求。
此外,如果某个特定消息导致错误,我怎么知道哪个消息导致了该错误?
module Database.PostgreSQL.Protocol.Client.Connection (
Frontend
) where
import Control.Concurrent.Chan
import Control.Concurrent.MVar
data FrontendSession = FrontendSession {
frontendSendQueue :: Chan FrontendMessage,
frontendRecvQueue :: Chan BackendMessage,
frontendProcQueue :: Chan BackendMessageHandler,
frontendSendThread :: ThreadId,
frontendRecvThread :: ThreadId,
frontendProcThread :: ThreadId
}
newtype BackendMessageHandler :: Consume (BackendMessage -> IO BackendMessageHandler) | Pass
beginFrontendSession :: (Int32 -> IO Lazy.ByteString) -> (Lazy.ByteString -> IO ()) -> IO FrontendSession
beginFrontendSession readData writeData = do
sendQueue <- newChan
recvQueue <- newChan
procQueue <- newChan
sendThread <- forkIO $ forever $ readChan sendQueue >>= writeData . toLazyByteString . frontendMessage
recvThread <- forkIO $ forever $ readBackendMessage readData >>= writeChan recvQueue
procThread <- forkIO $ let getNextMessage h = readChan recvQueue >>= apply h
apply (Consume h) m = h m >>= getNextMessage
apply (Pass) m = readChan procQueue >>= flip apply m
in getNextMessage Pass
return FrontendSession {
frontendSendQueue = sendQueue,
frontendRecvQueue = recvQueue,
frontendProcQueue = procQueue,
frontendSendThread = sendThread,
frontendRecvThread = recvThread
}
答案 0 :(得分:1)
有问题的图书馆似乎处于早期阶段。您询问的文件甚至不解析;并且在修复之后解析错误不会编译。我很怀疑是否有可能在一段时间内对这个代码库的任何问题给出认真的答案。不过,我会尝试。
我想知道如何以及何时有这种异步发送和接收的概念是有用的。如果我在单独的线程上获得响应,我如何知道任何给定响应属于哪个请求。
我不清楚“异步”意味着“你必须在不同的线程上发送和接收”。但是,这可能意味着允许这样做;在这种情况下,大概你的两个线程需要以某种方式相互通信。
此外,如果某个特定消息导致错误,我怎么知道哪个消息导致了该错误?
据推测,消息将包含某种标识符,错误将报告该标识符。