F# 对流进行节流,以便在收到对上一次写入的响应之前,写入将一直排队
假设我有一个流,它一次只允许一个请求/响应,但在多个线程中使用 应限制请求/命令,以便新请求只能发生一次 已发送上一个请求并收到答复 用户将能够做到这一点F# 对流进行节流,以便在收到对上一次写入的响应之前,写入将一直排队,f#,F#,假设我有一个流,它一次只允许一个请求/响应,但在多个线程中使用 应限制请求/命令,以便新请求只能发生一次 已发送上一个请求并收到答复 用户将能够做到这一点 let! res = getResponse("longResp") let! res2 = getResponse("shortResp") 不知道也不关心油门 我尝试了Tomas Petricek的一个修改版本,该版本允许与返回值异步,但这需要用户调用getResponse(“..”)|>Enqueue |>w.Post,这会导致灾难(
let! res = getResponse("longResp")
let! res2 = getResponse("shortResp")
不知道也不关心油门
我尝试了Tomas Petricek的一个修改版本,该版本允许与返回值异步,但这需要用户调用getResponse(“..”)|>Enqueue |>w.Post
,这会导致灾难(以防他们忘记这么做)
在F#?中是否有一种很好的/惯用的方法来实现这一点,然后在您的类型系统中明确表示返回的类型需要用另一个函数展开。因此,与其返回异步
type Queuable<'T> = Queuable of Async<'T>
let getResponse (s:string) =
let r =
async{
do! write to your stream
return! read from your stream
}
Queuable r
let enqueue (Queuable q) = async{
return! processor.PostAndAsyncReply(fun replyChannel -> replyChannel,q)
}
let processor = new MailboxProcessor<_>(fun inbox ->
let rec Loop() = async {
let! (r:AsyncReplyChannel<_>,job) = inbox.Receive()
let! res = job
r.Reply res
return! Loop()}
Loop())