Bối cảnh:Làm thế nào để coroutines stackless khác với coroutines stackful?
Tôi hỏi điều này vì hiện tại tôi có một ứng dụng có nhiều (hàng trăm đến hàng nghìn) chủ đề. Hầu hết các chủ đề đó là nhàn rỗi một phần lớn thời gian, chờ đợi các mục công việc được đặt trong hàng đợi. Khi một mục công việc có sẵn, nó được xử lý bằng cách gọi một số mã độc lập phức tạp tùy ý. Trên một số cấu hình hệ điều hành, ứng dụng gặp phải các thông số hạt nhân điều chỉnh số lượng quy trình người dùng tối đa, vì vậy tôi muốn thử nghiệm với phương tiện để giảm số lượng chuỗi công việc.
giải pháp đề xuất của tôi:
Nó có vẻ như một cách tiếp cận dựa trên coroutine, nơi tôi thay thế mỗi sợi nhân với một coroutine, sẽ giúp đỡ để thực hiện điều này. Sau đó tôi có thể có một hàng đợi công việc được hỗ trợ bởi một nhóm các luồng công nhân (kernel) thực tế. Khi một mục được đặt trong hàng đợi của một coroutine cụ thể để xử lý, một mục sẽ được đặt vào hàng đợi của nhóm luồng. Sau đó nó sẽ tiếp tục coroutine tương ứng, xử lý dữ liệu xếp hàng đợi của nó, và sau đó đình chỉ nó một lần nữa, giải phóng luồng công nhân để thực hiện công việc khác.
chi tiếtThực hiện:
Trong suy nghĩ về làm thế nào tôi sẽ làm điều này, tôi đang gặp rắc rối tìm hiểu sự khác biệt về chức năng giữa Stackless và coroutines stackful. Tôi có một số kinh nghiệm sử dụng coroutines xếp chồng lên nhau bằng cách sử dụng thư viện Boost.Coroutine. Tôi thấy nó tương đối dễ hiểu từ một mức khái niệm: cho mỗi coroutine, nó duy trì một bản sao của bối cảnh CPU và ngăn xếp, và khi bạn chuyển sang coroutine, nó chuyển sang bối cảnh đã lưu đó (giống như một bộ lập lịch chế độ hạt nhân).
Điều ít rõ ràng đối với tôi là làm thế nào một coroutine không có thứ tự khác với điều này. Trong ứng dụng của tôi, số tiền trên không liên quan đến việc xếp hàng các mục công việc được mô tả ở trên là rất quan trọng. Hầu hết các triển khai mà tôi đã thấy, chẳng hạn như the new CO2 library cho thấy rằng các coroutines không có thứ tự cung cấp nhiều công tắc ngữ cảnh phía trên thấp hơn nhiều.
Vì vậy, tôi muốn hiểu sự khác biệt về chức năng giữa các coroutines không có ngăn xếp và xếp chồng lên nhau rõ ràng hơn. Cụ thể, tôi nghĩ về những câu hỏi này:
References like this one gợi ý rằng sự khác biệt nằm ở chỗ, nơi bạn có thể mang lại/resume trong một stackful vs Stackless coroutine. Đây có phải là trường hợp không? Có một ví dụ đơn giản về một cái gì đó mà tôi có thể làm trong một coroutine stackful nhưng không phải trong một stackless?
Có bất kỳ giới hạn nào về việc sử dụng biến lưu trữ tự động (tức là các biến "trên ngăn xếp") không?
Có bất kỳ hạn chế nào đối với những chức năng nào tôi có thể gọi từ một coroutine không có ngăn xếp không?
Nếu không có tiết kiệm bối cảnh ngăn xếp cho một coroutine stackless, nơi mà các biến lưu trữ tự động đi khi coroutine đang chạy?
'Hầu hết các chủ đề này không hoạt động trong một phần lớn thời gian, chờ đợi các mục công việc được đặt trong hàng đợi' - nếu đây là trường hợp, tại sao có quá nhiều chủ đề? –
@MartinJames: Vì lý do cũ. Tôi không tuyên bố rằng đó là một thiết kế tốt như vậy, do đó mong muốn của tôi để cải thiện nó. Tái cấu trúc toàn bộ bán buôn ứng dụng không phải là một lựa chọn ngắn hạn, vì vậy tôi đang tìm kiếm các phần nâng cấp tương đối đơn giản để bắt đầu. Những thứ có khả năng làm phức tạp hơn nữa, cuộc gọi chặn đến hàng đợi thường được thực hiện một vài cấp độ sâu trong ngăn xếp cuộc gọi (tức là không ở chức năng cấp cao nhất của chuỗi công nhân). Tôi * nghĩ * điều này sẽ ngăn cản việc sử dụng các chủ đề không xếp chồng trong bối cảnh cụ thể này. –