gpt4 book ai didi

multithreading - F#:在异步返回之前 SwitchToThreadPool 的目的

转载 作者:行者123 更新时间:2023-12-04 06:47:46 25 4
gpt4 key购买 nike

Async.SwitchToNewThread 的 MS 文档中给出的例子之一是:

let asyncMethod f = 
async {
do! Async.SwitchToNewThread()
let result = f()
do! Async.SwitchToThreadPool()
return result
}

在 return 语句之前立即切换到线程池的目的是什么?我理解为什么当异步块有更多工作要做时,您可能想要从专用线程切换到线程池,但这里并非如此。

这不是主要问题的一部分,但我也很想知道为什么 SwitchToNewThread 和 SwitchToThreadPool 返回异步。是否有您不想立即“做!”的用例?这些任务?谢谢

最佳答案

这个例子可能更清楚,因为它没有展示任何真实的场景。

但是,在 return 之前切换到另一个线程是有充分理由的。 .原因是调用您的函数的工作流(例如 asyncMethod )将继续在您返回之前切换到的上下文/线程中运行。例如,如果你写:

Async.Start (async {
// Starts running on some thread (depends on how it is started - 'Async.Start' uses
// thread pool and 'Async.StartImmediate' uses the current thread
do! asyncMethod (fun () ->
Thread.Sleep(1000) ) // Blocks a newly created thread for 1 sec
// Continues running on the thread pool thread
Thread.Sleep(1000) }) // Blocks thread pool thread

我认为示例中使用的模式不太正确 - 异步工作流应始终返回到 SynchronizationContext它们在其上启动(例如,如果工作流在 GUI 线程上启动,则它可以切换到新线程,但随后应返回到 GUI 线程)。如果我在写 asyncMethod功能,我会使用:
let asyncMethod f = async {  
let original = System.Threading.SynchronizationContext.Current
do! Async.SwitchToNewThread()
let result = f()
do! Async.SwitchToContext(original)
return result }

回答你的第二个问题——原因 SwitchTo操作返回 Async<unit>并且需要使用 do! 调用是没有办法直接切换到不同的线程。将工作流的其余部分作为函数(可以在新线程上执行)的唯一点是使用 do! 时。或 let! Async<T> type 本质上只是一些获取函数(工作流的其余部分)并可以在任何地方执行它的对象,但没有其他方法可以“破坏”工作流。

关于multithreading - F#:在异步返回之前 SwitchToThreadPool 的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5433397/

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