gpt4 book ai didi

asynchronous - Async.Start 与 Async.StartChild

转载 作者:行者123 更新时间:2023-12-04 01:42:44 27 4
gpt4 key购买 nike

假设 asyncSendMsg不返回任何内容,我想在另一个异步块中启动它,但不等待它完成,这之间有什么区别:

async {
//(...async stuff...)
for msg in msgs do
asyncSendMsg msg |> Async.Start
//(...more async stuff...)
}


async {
//(...async stuff...)
for msg in msgs do
let! child = asyncSendMsg msg |> Async.StartChild
()
//(...more async stuff...)
}

最佳答案

关键区别在于,当您使用 Async.StartChild 启动工作流程时,它将与父级共享取消 token 。如果您取消父项,所有子项也将被取消。如果您使用 Async.Start 启动子进程,那么它就是一个完全独立的工作流程。

这是一个演示差异的最小示例:

// Wait 2 seconds and then print 'finished'
let work i = async {
do! Async.Sleep(2000)
printfn "work finished %d" i }

let main = async {
for i in 0 .. 5 do
// (1) Start an independent async workflow:
work i |> Async.Start
// (2) Start the workflow as a child computation:
do! work i |> Async.StartChild |> Async.Ignore
}

// Start the computation, wait 1 second and than cancel it
let cts = new System.Threading.CancellationTokenSource()
Async.Start(main, cts.Token)
System.Threading.Thread.Sleep(1000)
cts.Cancel()

在本例中,如果您使用 (1) 开始计算,然后所有工作项将在 2 秒后完成并打印。如果您使用 (2)当主工作流被取消时,它们都会被取消。

关于asynchronous - Async.Start 与 Async.StartChild,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15284209/

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