2021-03-11: На ходу сопрограмма включена внутри сопрограммы, они в порядке, верно? Если внешняя сопрограмма сломана, внутренняя сопрограмма все равно будет выполняться

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 退出")
}

Результаты выполнения следующие:
Вставьте описание изображения сюда


Знать ответ
комментарий

рекомендация

отblog.51cto.com/14891145/2656416
рекомендация