2014-07-11 22 views
6

Tôi nghĩ rằng đây là một câu hỏi về logic hơn là tự đi. Tôi muốn tìm cách thực thi tác vụ dựa trên sự phụ thuộc của nó trong ngôn ngữ đi.Thực hiện nhiệm vụ dựa trên các phụ thuộc trong Go

Task Workflow

Xét workflow trên: công tác 1,2,3 và 4 có thể chạy không đồng bộ cùng một lúc. Nhiệm vụ 10 sẽ được thực thi khi Task 1 và 2 kết thúc. Nhiệm vụ 11 sẽ được thực thi khi Nhiệm vụ 3 và 4 được hoàn thành Nhiệm vụ 12 sẽ được thực hiện khi Task 11 và 12 được hoàn thành Nhiệm vụ 100 sẽ được thực hiện khi Task 10 và 11 kết thúc.

Tôi đang sử dụng các kênh đi để thực hiện các thao tác đồng thời và muốn tìm cách hiệu quả để kiểm soát các phụ thuộc. Tôi biết tôi có thể có một số loại cờ và một bảng để kiểm soát việc thực hiện nhưng lý tưởng là tôi muốn làm điều đó trong bộ nhớ để tránh các cuộc gọi cơ sở dữ liệu để kiểm soát điều đó. Tôi cũng hiểu rằng có một số cách để làm điều này, nhưng muốn nghe ý tưởng của bạn bởi vì tôi chắc chắn có một cách tốt hơn để làm hơn những cách tôi có thể đến với cho đến nay.

Trả lời

5

Có một thú vị reddit thread về chủ đề đó, để phản hồi bài viết "How to Wait for All Goroutines to Finish Executing Before Continuing".

Bài viết chính xác là "How to Wait for All Goroutines to Finish Executing Before Continuing, Part Two: Fixing My Oops" và minh họa một số cách để chờ goroutines trước khi tiếp tục với một tác vụ khác.

Tùy thuộc vào loại thông tin bạn có cho các tác vụ cần đồng bộ hóa, sync.WaitGroup là một ứng cử viên tốt (như in this example).

Nhưng:

Khi bạn biết số tin nhắn để mong đợi bạn cũng có thể đếm chúng biết khi nào kết thúc. Ở đây WaitGroup là thừa và khó hiểu.

này sẽ chặn đến khi tất cả 3 tin nhắn nhận được:

func main() { 
    messages := make(chan int) 
    go func() { 
     time.Sleep(time.Second * 3) 
     messages <- 1 
    }() 
    go func() { 
     time.Sleep(time.Second * 2) 
     messages <- 2 
    }() 
    go func() { 
     time.Sleep(time.Second * 1) 
     messages <- 3 
    }() 
    for i := 0; i < 3; i++ { 
     fmt.Println(<-messages) 
    } 
} 

Vì vậy, nó thực sự phụ thuộc vào những gì bạn biết từ những nhiệm vụ bạn đang chờ đợi.

+0

Vấn đề là tôi không muốn đợi TẤT CẢ các thói quen đồng thời để hoàn thành. Ví dụ: nếu Nhiệm vụ 1,2,3 và 4 có thể chạy cùng một lúc. Giả sử, Nhiệm vụ 1,2,3 mất 10 giây để hoàn thành và nhiệm vụ 4 mất 10 phút. Trong trường hợp này, nhiệm vụ 11 vẫn phải đợi cho Task4, tuy nhiên tiến trình có thể đi trước và thực thi Task 10, phụ thuộc vào nhiệm vụ 1 và 2 mà thôi. Nếu tôi đợi tất cả các thủ tục để hoàn thành, nhiệm vụ 10 sẽ đợi nhiệm vụ 4, điều đó không chính xác vì chúng không phụ thuộc lẫn nhau. –

+0

@ J.B quan điểm của tôi là minh họa cách làm việc trên số * n * số của goroutine. Nếu 'n' trong trường hợp của bạn là 1,2 và 3, thì câu trả lời của tôi là viết tắt. Bạn có thể điều chỉnh các phương thức đồng bộ hóa khác nhau mà tôi tham chiếu trong câu trả lời cho bất kỳ số lượng goroutine nào bạn muốn. – VonC

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