gpt4 book ai didi

asynchronous - "Throttled"在 F# 中异步下载

转载 作者:行者123 更新时间:2023-12-04 09:37:26 24 4
gpt4 key购买 nike

我正在尝试下载从我博客的 xml 备份中引用的 3000 多张照片。我遇到的问题是,如果只有其中一张照片不再可用,则整个异步都会被阻止,因为 AsyncGetResponse 不会超时。

ildjarn帮助我组合了一个 AsyncGetResponse 版本,它在超时时失败,但使用它会产生更多超时 - 好像请求只是排队超时。似乎所有的 WebRequests 都是“立即”启动的,让它工作的唯一方法是将超时设置为下载所有它们所需的时间:这不是很好,因为这意味着我已经根据以下情况调整了超时图像的数量。

我是否达到了 Vanilla 的极限async ?我应该看看响应式(Reactive)扩展吗?

这有点尴尬,因为我已经问过two questions在这段特殊的代码中,我仍然没有按照我想要的方式工作!

最佳答案

我认为必须有比使用超时更好的方法来发现文件不可用。我不太确定,但是如果找不到文件,有没有办法让它抛出异常?然后你可以把你的 async 包裹起来里面的代码try .. with你应该避免大部分问题。

无论如何,如果您想编写自己的“并发管理器”来并行运行一定数量的请求并将剩余的待处理请求排队,那么 F# 中最简单的选择是使用代理(MailboxProcessor 类型)。以下对象封装了该行为:

type ThrottlingAgentMessage = 
| Completed
| Work of Async<unit>

/// Represents an agent that runs operations in concurrently. When the number
/// of concurrent operations exceeds 'limit', they are queued and processed later
type ThrottlingAgent(limit) =
let agent = MailboxProcessor.Start(fun agent ->
/// Represents a state when the agent is blocked
let rec waiting () =
// Use 'Scan' to wait for completion of some work
agent.Scan(function
| Completed -> Some(working (limit - 1))
| _ -> None)
/// Represents a state when the agent is working
and working count = async {
while true do
// Receive any message
let! msg = agent.Receive()
match msg with
| Completed ->
// Decrement the counter of work items
return! working (count - 1)
| Work work ->
// Start the work item & continue in blocked/working state
async { try do! work
finally agent.Post(Completed) }
|> Async.Start
if count < limit then return! working (count + 1)
else return! waiting () }
working 0)

/// Queue the specified asynchronous workflow for processing
member x.DoWork(work) = agent.Post(Work work)

关于asynchronous - "Throttled"在 F# 中异步下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6219726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com