gpt4 book ai didi

go - 运行 goroutine 直到其中一个的有效结果

转载 作者:行者123 更新时间:2023-12-01 22:39:46 26 4
gpt4 key购买 nike

有没有办法运行一些 goroutine 直到其中一个返回有效值(大于零的整数)?
在 goroutine 中,我要猜测一个需要放入数学公式中的数字

最佳答案

你必须自己写这个。

一个 goroutine 一直运行直到它返回。每个 goroutine 自己决定何时返回。

假设您有函数/过程 A、B 和 C,它们中的每一个都进行了长时间的计算,并且三个中的一个可能首先找到有用的答案,如果是这样,另外两个应该停止。在这种情况下,您需要分拆三个执行计算的 goroutine:

func doA(args) {
... do computing for A ...
... deliver a result ...
return // this line is redundant, and here only for illustration
}

func doB(args) {
... do computing for B ...
... deliver a result ...
}

等等。
args 中的内容?好吧,这取决于您,但最好给所有三个函数提供某种方式,以找出其他函数中的一个提供了有用的答案并且它们应该停止。一个非常聪明的方法是让某人(例如,无论谁认为结果“有用”)关闭一个 channel ,以指示其他所有人都应该停止工作。所有 do然后函数看起来像这样:
func doA(done chan struct{}, other_args) {
var result_ready bool

for !result_ready {
select {
case <-done: // someone else delivered a good result
return // so stop working now
default:
... work a bit more ...
}
}
... deliver result ...
}

那仍然留下“交付结果”部分。结果去哪儿了?这也取决于您,但处理此问题的一个好方法是在每个例程中都有一个 channel ,当他们有一个 channel 时可以输出结果。

这里有一些技巧需要考虑。假设 main driver 想要查看多个结果并选择一个“足够好”的结果,我们不想编码到每个 worker 中。每个 worker 都应该做一些工作并发送到目前为止的答案,然后继续工作直到 main main 说“我喜欢我得到的答案之一”关闭 done channel 。然后我们最终得到这样的代码结构:
func doA(done chan struct{}, resultChan chan resulttype, args) {
for {
select {
case <-done:
return
default:
... do a little work ...
... try to deliver result-so-far ...
}
}
}

到目前为止,尝试交付结果应该是这样的:
select {
case <-done:
return
case resultChan <- result:
}

这很可能消除对早期 select 的需要。 : 我们有计算 A 的东西计算直到准备好结果,然后处理“您现在可以退出”或“您的结果正在发送”,以先发生者为准。如果“你可以退出”首先出现,它就会退出。如果“正在发送您的结果”,它会立即返回处理下一个问题。

在最坏的情况下, doA运行时间比它需要的时间长一点:获得一个结果需要多长时间。

请注意,“完成 channel ”的概念以及在许多实际程序中有用的许多其他脚手架都包含在上下文的概念中。见 Go Concurrency Patterns: Context并且,在这里更直接地与您自己的问题相关, Go Concurrency Patterns: Pipelines and cancellation .

关于go - 运行 goroutine 直到其中一个的有效结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58649939/

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