2021-03-11: На ходу сопрограмма включена внутри сопрограммы, все в порядке, верно? Если внешняя сопрограмма сломана, будет ли выполняться внутренняя сопрограмма? Как остановить внутреннюю сопрограмму при выполнении внешней сопрограммы? Как остановить внутреннюю сопрограмму в пакете, предоставленном golang?
Ответ Фу Ге 2021-03-11:
1. Внешняя сопрограмма и внутренняя сопрограмма не имеют ничего общего.
2. Если программа не выйдет из строя, это не повлияет на дальнейшее выполнение внутренней сопрограммы. Если не делать никаких специальных действий, вся программа выйдет из строя.
3. Три способа: общая переменная как бит флага, канал, контекст. Все эти три метода являются совместными, а не вытесняющими прерываниями. Для программистов невозможно добиться вытесняющих прерываний.
Если вы можете добиться вытеснения, пришлите код, спасибо.
Код написан на голанге, код следующий:
package main
import (
"context"
"fmt"
"time"
)
func main() {
input := 0
for {
fmt.Println("1.标志位方式")
fmt.Println("2.通道方式")
fmt.Println("3.上下文方式")
fmt.Println("4.退出")
fmt.Println("请输入数字:")
fmt.Scanf("%d", &input)
switch input {
case 1:
go outer1()
case 2:
go outer2()
case 3:
go outer3()
default:
return
}
time.Sleep(time.Second * 7)
}
fmt.Scanf("%d", &input)
}
//1.标志位
func outer1() {
isInterrupt := false
inner := func() {
for {
if isInterrupt {
fmt.Println("inner1 退出")
break
} else {
fmt.Println("inner1 执行中...")
time.Sleep(time.Second * 1)
}
}
}
go inner()
fmt.Println("outer1 等待中... 5s")
time.Sleep(time.Second * 5)
isInterrupt = true
fmt.Println("outer1 退出")
}
//2.通道
func outer2() {
c := make(chan struct{}, 1)
inner2 := func() {
for {
select {
case <-c:
fmt.Println("inner2 退出...")
return
default:
fmt.Println("inner2 执行中...")
time.Sleep(time.Second * 1)
}
}
}
go inner2()
fmt.Println("outer2 等待中... 5s")
time.Sleep(time.Second * 5)
c <- struct{}{}
fmt.Println("outer2 退出")
}
//3.context
func outer3() {
ctx, cancel := context.WithCancel(context.Background())
inner3 := func() {
for {
select {
case <-ctx.Done():
fmt.Println("inner3 退出...")
return
default:
fmt.Println("inner3 执行中...")
time.Sleep(time.Second * 1)
}
}
}
go inner3()
fmt.Println("outer3 等待中... 5s")
time.Sleep(time.Second * 5)
//操作
cancel()
fmt.Println("outer3 退出")
}
Результаты выполнения следующие: