2015-03-05 18 views
5

Tôi đã tìm kiếm xung quanh, nhưng cho đến nay chỉ có một bài viết tương tự được viết here bởi Ariejan de Vroom.Kiểm tra Golang Goroutine

Tôi muốn biết nếu tôi có thể đưa goroutine vào thử nghiệm đơn vị sao cho có thể đếm chính xác số đồng thời của goroutines đang chạy và có thể cho tôi biết nếu chúng được sinh ra chính xác trong số tôi đã nói.

Tôi có đoạn mã sau ví dụ ..

import (
    "testing" 
    "github.com/stretchr/testify/assert" 
) 

func createList(job int, done chan bool) { 
    time.Sleep(500) 
    // do something 
    time.Sleep(500) 
    done <- true 
    return 
} 

func TestNewList(t *testing.T) { 
    list := NewList() 
    if assert.NotNil(t, list) { 
    const numGoRoutines = 16 
    jobs := make(chan int, numGoRoutines) 
    done := make(chan bool, 1) 

    for j := 1; j <= numGoRoutines; j++ { 
     jobs <- j 
     go createList(j, done) 
     fmt.Println("sent job", j) 
    } 
    close(jobs) 
    fmt.Println("sent all jobs") 
    <-done 
} 
+1

biết chính xác là bạn đang cố gắng để xác minh? Rằng bạn đang bắt đầu 16 goroutines? Tôi không hoàn toàn theo dõi vấn đề bạn đang cố giải quyết. – sberry

+0

Tại sao bạn gửi int đến kênh công việc? Có vẻ như bạn có 2 thiết kế ở đó. – LenW

Trả lời

0

Đơn giản trong ví dụ của bạn, bạn có thể đọc kênh đã hoàn thành numGoRoutines lần để xác minh rằng bạn nhận được nhiều câu trả lời?

0

Như tôi đã hiểu, bạn sẵn sàng giới hạn số lượng các thường trình chạy đồng thời và xác minh xem nó có hoạt động đúng hay không. Tôi sẽ đề nghị viết một chức năng mà sẽ có một thói quen như và đối số và sử dụng thói quen giả để kiểm tra nó.
Trong ví dụ sau spawn chức năng chạy fn thường lệ count lần nhưng không quá limit đồng thời. Tôi quấn nó vào chức năng chính để chạy nó ở sân chơi nhưng bạn có thể sử dụng phương pháp tương tự cho phương pháp thử nghiệm của bạn.

package main 

import (
    "fmt" 
    "sync" 
    "time" 
) 

func spawn(fn func(), count int, limit int) { 
    limiter := make(chan bool, limit) 

    spawned := func() { 
     defer func() { <-limiter }() 
     fn() 
    } 

    for i := 0; i < count; i++ { 
     limiter <- true 
     go spawned() 
    } 
} 

func main() { 

    count := 10 
    limit := 3 

    var wg sync.WaitGroup 
    wg.Add(count) 

    concurrentCount := 0 
    failed := false 

    var mock = func() { 
     defer func() { 
      wg.Done() 
      concurrentCount-- 
     }() 

     concurrentCount++ 
     if concurrentCount > limit { 
      failed = true // test could be failed here without waiting all routines finish 
     } 

     time.Sleep(100) 
    } 

    spawn(mock, count, limit) 

    wg.Wait() 

    if failed { 
     fmt.Println("Test failed") 
    } else { 
     fmt.Println("Test passed") 
    } 
} 

Playground

Các vấn đề liên quan