Почему дрм.Println внутри goroutine не печатает строку?



у меня есть следующий код:



package main

import "net"
import "fmt"
import "bufio"

func main() {
conn, _ := net.Dial("tcp", "irc.freenode.net:6667")

reader := bufio.NewReader(conn)
go func() {
str, err := reader.ReadString('n')
if err != nil {
// handle it
fmt.Println(err)
}
fmt.Println(str)
}()

}


Если у меня нет кода, который читает из буфера в goroutine, он выводит сообщение, подобное этому, что я и ожидаю:



:zelazny.freenode.net NOTICE * :*** Looking up your hostname...


однако, имея его внутри goroutine ничего не печатает.



может кто-нибудь объяснить, почему это так?

547   4  
go

4 ответов:

ваша программа выйдет, когда main() завершает функцию. Это, вероятно, произойдет до того, как ваш goroutine успеет запустить и распечатать свой вывод.

одним из вариантов было бы чтение основного блока goroutine из канала и запись goroutine в канал, когда он завершит свою работу.

еще один распространенный способ "дождаться конца goroutines", использует WaitGroup: http://golang.org/pkg/sync/#WaitGroup . Вы можете использовать waitGroup.Add(1) для каждого запущенного goroutine, затем используйте waitGroup.Done() в каждом goroutine после его завершения. В основной функции вы можете использовать waitGroup.Wait() и это будет ждать, пока waitGroup.Done() был вызван для каждого добавленного goroutine.

запись данных в канал ch в конце goroutine и читать данные из ch из goroutine может сделать основную функцию, ожидающую сообщения печати goroutine.

вот пример:

package main

import "net"
import "fmt"
import "bufio"

func main() {
conn, _ := net.Dial("tcp", "irc.freenode.net:6667")

reader := bufio.NewReader(conn)
ch := make(chan byte, 1)
go func() {
    str, err := reader.ReadString('\n')
    if err != nil {
        // handle it
        fmt.Println(err)
    }
    fmt.Println(str)
    ch <- 1
  }()
  <-ch
}

вам нужно добавить задержку времени как time.Sleep(3 * time.Second) (это ждет 3 секунды).

goroutine закрывается, когда программа завершается. У меня была точно такая же проблема.

Comments

    Ничего не найдено.