2009-12-10 10 views
8

Có cách nào để đảm bảo rằng goroutine sẽ chỉ chạy trong một chuỗi hệ điều hành cụ thể không? Ví dụ, khi các hoạt động GUI phải chạy trong luồng GUI, nhưng có thể có nhiều goroutines đang chạy mã GUI.Buộc goroutines vào cùng một luồng

GOMAXPROCS(1) thực hiện công việc về mặt kỹ thuật, nhưng điều đó đánh bại mục đích đa luồng.

LockOSThread() cũng hoạt động, nhưng điều đó cũng ngăn không cho bất kỳ goroutine nào khác chạy trong chuỗi đó.

Có cách nào để làm điều này, hoặc phải tất cả mọi thứ yêu cầu cùng một luồng cũng chạy trong cùng một goroutine?

Trả lời

8

Theo hiểu biết tốt nhất của tôi, hiện tại không phải. Tôi nghĩ rằng 'đi giống như' cách để làm điều này sẽ là viết một Goroutine chạy trong các chủ đề GUI và các yêu cầu dịch vụ từ các goroutines khác được gửi qua trên một kênh. Ví dụ, bạn có thể đọc nó từ một kênh chấp nhận các con trỏ hàm và thực hiện các hàm đó.

+2

-1 Câu trả lời của bạn cho "Có cách nào để đảm bảo rằng goroutine sẽ chỉ chạy trong một chuỗi hệ điều hành cụ thể không?" là "viết một Goroutine chạy trong thread GUI"? Làm thế nào điều này nghĩa vụ phải giúp tôi? –

+3

Bạn đã chỉ ra rằng LockOSThread cho phép bạn khóa goroutine thành một chuỗi cụ thể. Đơn giản chỉ cần làm như vậy cho thread GUI. –

+0

Điều đó cho phép bạn khóa goroutine thành luồng * hiện tại *, chứ không phải một chuỗi cụ thể tùy ý. – robx

3

Tại sao bạn muốn thực hiện việc này? Tôi tin rằng runtime.LockOSThread() là cần thiết nếu bạn đang tạo thư viện ràng buộc từ mã C sử dụng bộ nhớ cục bộ. Nếu không, chỉ cần để bộ lập lịch ghép các goroutine cho bạn.

Và lưu ý rằng runtime.LockOSThread() chỉ ngăn các goroutines khác chạy trong chuỗi đó cho đến khi bạn gọi runtime.UnlockOSThread().

+0

1) Như OP ngụ ý mã GUI cần goroutines cho đồng thời nhưng có thể không muốn chia sẻ ưu tiên tài nguyên CPU với mã khác cần thông lượng cao hơn mặc dù điều đó có thể không mong muốn; 2) Khả năng [hạn chế goroutines sinh sản] (https://stackoverflow.com/questions/30646391/does-runtime-lockosthread-allow-child-goroutines-to-run-in-same-os-thread) cho cùng một Chuỗi hệ điều hành [có thể hỗ trợ thiết kế không khóa đồng thời] (https://github.com/keean/zenscript/issues/17#issuecomment-359338947). –