package goroutine import ( "fmt" "math/rand" "strconv" "sync" "time" "toutoukan/model/routine" ) func NewProducer(ch chan routine.Task, wg *sync.WaitGroup, done chan struct{}, num int, mutex *sync.Mutex, data *routine.Data, rwmutex *sync.RWMutex) { defer wg.Done() timech := time.Tick(1 * time.Second) rand.Seed(time.Now().UnixNano()) for { select { case <-timech: fmt.Printf("生产者%d号上锁\n", num+1) randnum := rand.Intn(100) task := routine.Task{ Id: strconv.Itoa(randnum), Content: "访问数据库", } mutex.Lock() data.Count += 1 mutex.Unlock() rwmutex.Lock() data.Record[randnum] += 1 rwmutex.Unlock() fmt.Printf("生产者%d号注入编号为%s,内容为:%s\n", num+1, task.Id, task.Content) ch <- task fmt.Printf("生产者%d号释放锁\n", num+1) case <-done: fmt.Printf("生产者%d号退出任务\n", num+1) return } } }