F#中Async.StartImmediate是否全程在同一线程执行async进程?
关于F#
Async.StartImmediate的线程执行疑问 Async.StartImmediate的命名容易让人混淆,因为Async.Start同样会立即启动异步任务,只是它是在线程池上运行的。
根据文档说明,Async.StartImmediate使用调用线程启动任务,那么在不包含其他async、let!、do!、return!等异步绑定的简单异步任务(比如async { printfn "testing" })的整个生命周期中,是否始终在同一线程执行?还是可能在某个时刻切换线程?
已知Async.Start基于线程池运行,允许任务切换底层线程。
对于你提到的这种无任何异步绑定的简单异步任务,使用Async.StartImmediate执行时,它会全程在调用线程上运行,不会发生线程切换。
这类异步任务本质上就是同步代码的包装,没有任何需要挂起、等待后恢复的异步操作。Async.StartImmediate会直接在当前调用线程上同步执行整个任务体,直到完成,全程不会交出线程控制权,自然也就不存在切换线程的可能。
对比Async.Start:它会把任务提交到线程池执行,线程池可能会根据调度策略切换执行线程;但Async.StartImmediate的核心逻辑就是在调用线程上直接跑任务,只要任务里没有触发异步挂起的操作(比如let!等待另一个异步任务),就不会换线程。
内容的提问来源于stack exchange,提问作者bmitc
相关产品推荐
相关产品推荐

