gpt4 book ai didi

f# - 让!/做!总是在新线程中运行异步对象?

转载 作者:行者123 更新时间:2023-12-04 20:38:27 26 4
gpt4 key购买 nike

来自 wikibook在 F# 上有一小部分它说:

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.



我没有在书籍或网络上找到任何其他地方说明这一事实(以粗体突出显示)。

对所有人都是这样吗 let!/ do!不管异步对象包含什么(例如 Thread.Sleep() )以及它是如何启动的(例如 Async.Start )?

查看 github 上的 F# 源代码,我无法找到在新(TP)线程上执行绑定(bind)调用的位置。魔法发生在代码的什么地方?

最佳答案

你觉得这句话的哪一部分令人惊讶?单个异步的部分可以在不同的线程池线程上执行,或者线程池线程必须在每次绑定(bind)时被释放和获取?

如果是后者,那我同意——这听起来不对。看着code ,只有少数几个地方在线程池中排队了一个新的工作项(即少数 Async 内部使用 queueAsync 的模块函数)和 Async.SwitchToNewThread产生一个非线程池线程并在那里运行延续。单独的绑定(bind)似乎不足以切换线程。

然而,声明的精神似乎与前者有关 - 不保证 async 的部分内容 block 将在同一个线程上运行。您运行的确切线程应该被视为实现细节,当您让出控制权并等待某些结果时,您可以确定至少在某些时候您将登陆不同的线程。

关于f# - 让!/做!总是在新线程中运行异步对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30899792/

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