让!/做!总是 运行 新线程中的异步对象?
Does let!/do! always run the async object in a new thread?
在 F# 的 wikibook 中有一个小部分说:
What does let! do?#
let!
runs an async<'a>
object on its own thread, then it immediately
releases the current thread back to the threadpool. When let!
returns,
execution of the workflow will continue on the new thread, which may
or may not be the same thread that the workflow started out on.
我没有在其他任何书籍或网络上找到说明这一事实(以粗体突出显示)的地方。
无论异步对象包含什么(例如 Thread.Sleep()
)以及它是如何启动的(例如 Async.Start
),所有 let!
/do!
都是这样吗?
查看 github 上的 F# 源代码,我无法找到绑定调用在新 (TP) 线程上执行的位置。魔术发生在代码的哪个位置?
没有。异步操作可能在当前线程上同步执行,也可能最终在不同的线程上完成。这完全取决于所讨论的异步 API 的实现方式。
请参阅 Do the new C# 5.0 'async' and 'await' keywords use multiple cores? 以获得合理的解释。 F#和C#async的实现细节不同,但总体原理是一样的。
实现 F# async
计算表达式的生成器是 here。
您觉得该陈述的哪一部分令人惊讶?单个异步的部分可以在不同的线程池线程上执行,或者线程池线程必须在每次绑定时被释放和获取?
如果是后者,那我同意——听起来不对。查看 code,只有几个地方在线程池上排队新的工作项(即内部使用 queueAsync
的少数 Async
模块函数),并且 Async.SwitchToNewThread
产生一个非线程池线程并且 运行 在那里继续。单独绑定似乎不足以切换线程。
然而,声明的精神似乎是关于前者的——不保证 async
块的部分将 运行 在同一线程上。您 运行 所在的确切线程应被视为实现细节,当您放弃控制权并等待某些结果时,您可以非常确定至少在某些时候您会进入不同的线程。
在 F# 的 wikibook 中有一个小部分说:
What does let! do?#
let!
runs anasync<'a>
object on its own thread, then it immediately releases the current thread back to the threadpool. Whenlet!
returns, execution of the workflow will continue on the new thread, which may or may not be the same thread that the workflow started out on.
我没有在其他任何书籍或网络上找到说明这一事实(以粗体突出显示)的地方。
无论异步对象包含什么(例如 Thread.Sleep()
)以及它是如何启动的(例如 Async.Start
),所有 let!
/do!
都是这样吗?
查看 github 上的 F# 源代码,我无法找到绑定调用在新 (TP) 线程上执行的位置。魔术发生在代码的哪个位置?
没有。异步操作可能在当前线程上同步执行,也可能最终在不同的线程上完成。这完全取决于所讨论的异步 API 的实现方式。
请参阅 Do the new C# 5.0 'async' and 'await' keywords use multiple cores? 以获得合理的解释。 F#和C#async的实现细节不同,但总体原理是一样的。
实现 F# async
计算表达式的生成器是 here。
您觉得该陈述的哪一部分令人惊讶?单个异步的部分可以在不同的线程池线程上执行,或者线程池线程必须在每次绑定时被释放和获取?
如果是后者,那我同意——听起来不对。查看 code,只有几个地方在线程池上排队新的工作项(即内部使用 queueAsync
的少数 Async
模块函数),并且 Async.SwitchToNewThread
产生一个非线程池线程并且 运行 在那里继续。单独绑定似乎不足以切换线程。
然而,声明的精神似乎是关于前者的——不保证 async
块的部分将 运行 在同一线程上。您 运行 所在的确切线程应被视为实现细节,当您放弃控制权并等待某些结果时,您可以非常确定至少在某些时候您会进入不同的线程。