[英]Does asynchronous message transmission and reception make sense in PSQL protocol?
我试图理解以下代码(取自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
}
有关的图书馆似乎还处于初期阶段。 您要查询的文件甚至没有解析; 修复解析错误后,无法编译。 我非常怀疑是否有可能在一段时间内对有关此代码库的任何问题给出认真的答案。 不过,我会尝试。
我想知道异步发送和接收的概念如何以及何时有用。 如果我将响应返回到单独的线程上,那么我怎么知道给定响应属于哪个请求。
我不清楚“异步”是否意味着“必须在单独的线程上发送和接收”。 但是,这可能意味着可以这样做; 在这种情况下,大概您的两个线程需要以某种方式相互通信。
另外,如果特定消息导致错误,我怎么知道哪个消息导致该错误?
大概消息将包含某种标识符,并且错误将报告该标识符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.