第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何關(guān)閉等待 I/O 的 goroutine

如何關(guān)閉等待 I/O 的 goroutine

Go
桃花長相依 2021-10-11 10:32:31
我創(chuàng)建了兩個(gè) go 例程sender和receiver,sender 將不斷從用戶(鍵盤)獲取數(shù)據(jù)并寫入流,receiver 將獨(dú)立地從流中獲取值將其打印到屏幕上。兩者都使用 goroutine 并發(fā)在某個(gè)時(shí)間點(diǎn)接收器失敗并關(guān)閉連接并退出接收器 go 例程,但等待用戶輸入(i/o 操作)的發(fā)送器 go 例程不會(huì)關(guān)閉。這種場景下如何退出所有的goroutine?下面是此場景的示例代碼。package mainimport (    "fmt"    "time")var stop bool = falsefunc sender() {    str := ""    for !stop {        fmt.Scanf("%s", &str)        fmt.Println("Entered :", str)    }       fmt.Println("Closing sender goroutine")}func receiver() {    i := 0    for !stop {        i++        if i > 5 {             stop = true        }        time.Sleep(1 * time.Second)    }       fmt.Println("Closing receiver goroutine")}func main() {    go sender()    go receiver()    /* Wait for goroutines to finish */    for !stop {        time.Sleep(1 * time.Millisecond)    }       time.Sleep(1 * time.Second)    panic("Display stack")}上面的代碼發(fā)送者將在 5 個(gè)循環(huán)接收者退出接收者程序后等待用戶輸入。 I expect when receiver close, go routine which waiting on i/o has to be closed.請幫助我解決這個(gè)問題。
查看完整描述

2 回答

?
素胚勾勒不出你

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊

正如 Dave C 和 JimB 所說,使用通道來協(xié)調(diào) goroutine。這是一個(gè)可能會(huì)有所幫助的示例。


收到用戶的5條消息后退出:


package main


import "fmt"


var pipe = make(chan string) //shares text entered by user

var stop = make(chan bool)   //shares stop signal


func listen() {

    for {

        var input string

        fmt.Scan(&input)

        pipe <- input

    }

}


func write() {

    for i := 0; i < 5; i++ {

        var output string

        output = <-pipe

        fmt.Println("Received", output)

    }


    stop <- true

}


func main() {

    go listen()

    go write()


    <-stop

}


查看完整回答
反對 回復(fù) 2021-10-11
?
阿波羅的戰(zhàn)車

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊

首先,您的代碼有一個(gè)圍繞stop變量的競賽。當(dāng)發(fā)生數(shù)據(jù)競爭時(shí),無法保證您的程序會(huì)按照定義的那樣運(yùn)行。使用通道來同步 goroutine。然而,這不是您繼續(xù)編程的原因。


您的代碼在 上阻塞fmt.Scanf,無法檢查stop條件。由于無法中斷 Stdin 上的讀取(發(fā)生在 內(nèi)部fmt.Scanf),因此您需要在Scanf再次調(diào)用之前檢查停止條件。如果沒有更多輸入,但您在 Stdin 上有一個(gè)待處理的 Read,處理它的最簡單方法是讓 goroutine 運(yùn)行。有一些相當(dāng)復(fù)雜的方法可以使用稱為“自管道”的技巧來解決這個(gè)問題,但通常不值得付出努力,因?yàn)?goroutine 很小并且不占用太多資源。


for !stop {

    fmt.Scanf("%s", &str)

    fmt.Println("Entered :", str)

    // use a channel to detect when to exit

    select {

    case <-stop:

        return

    default:

    }

}


查看完整回答
反對 回復(fù) 2021-10-11
  • 2 回答
  • 0 關(guān)注
  • 249 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)