Golang time.Tick блокирует, когда другие goroutines создают новую структуру и структура имеет срез байта [] - PullRequest
0 голосов
/ 01 декабря 2018

Я новичок в golang, сегодня я столкнулся с проблемой времени. Отметьте, это может очень запутать меня, пожалуйста, посмотрите следующий код

var MAX_LEN4 = 5000

func main() {
    ch := make(chan struct{}, 100)
    var length uint = 0
    start := time.Now()

    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        tick := time.Tick(1 * time.Second)
        for {
            if length > MAX_LEN4+1 {
                break
            }
            <-tick
            fmt.Printf("Calculated: %d, time: %f\n", length, time.Since(start).Seconds())

        }
        wg.Done()
    }()

    for ; length <= MAX_LEN4+1; length++ {
        go test3(length, &ch)
    }

    wg.Wait()
    fmt.Println("Test Finished")
}

func test3(l uint, ch *chan struct{}) {
    NewEncoder()
    // do something
}

type Encoder struct {
    stream []byte
    offset uint
    //bitLeft uint
}

func NewEncoder() Encoder {
    return Encoder{make([]byte, 4)}
}

, когда struct Encoder имеет [] байт, тикбудет заблокирован, код не будет печатать содержимое «Вычислено ...», и код

<-tick

будет блокироваться там.как в приведенном выше коде

, если struct Encoder не имеет фрагмента, но функция NewEncoder возвращает указатель, тик также не работает, как в следующем коде

func NewEncoder() *Encoder {
    return &Encoder{4)}
}

только struct Encoderне имеет [] байтового среза и функция NewEncoder не возвращает указатель Encoder, тик будет работать нормально.

Я пытаюсь заменить код:

<-tick 

на

time.Sleep(1 * time.Second) 

эффект тот же

Не знаю, почему код?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...