2015-03-25 20 views
5

tôi đang cố gắng để tạo ra một ứng dụng không đồng bộ sử dụng mô-đun asyncio của Python. Tuy nhiên, tất cả các triển khai tôi có thể tìm thấy trên tài liệu được dựa trên một Vòng lặp sự kiện duy nhất.Tính sẵn sàng cao cho Python của asyncio

Có cách nào để khởi động nhiều tổ chức sự kiện Loops chạy cùng một ứng dụng, vì vậy tôi có thể đạt được tính sẵn sàng cao và khả năng chịu lỗi? Nói cách khác, tôi muốn mở rộng ứng dụng của mình bằng cách chèn các nút mới có thể chia sẻ việc thực thi các coroutine phía sau bộ cân bằng tải.

Tôi hiểu đó là một vấn đề cố hữu giữa lập trình không đồng bộ và thread-an toàn, có lẽ những gì tôi có trong tâm trí là thậm chí không thể. Nếu vậy, làm thế nào để tránh loại SPOF này trên kiến ​​trúc không đồng bộ?

+1

Bạn đang nói về mã mạng trừu tượng hoặc máy chủ web cụ thể như aiohttp? –

+4

Bạn có thể chạy nhiều vòng lặp sự kiện, nhưng tôi đoán rằng bạn có thể muốn chạy nhiều phiên bản của chương trình asyncio của bạn và sử dụng nginx hoặc một số máy chủ web khác để cân bằng tải chúng. Nếu đó là những gì bạn đang tìm kiếm, tôi nghĩ rằng bạn có thể nhận được sự giúp đỡ trên serverfault – leech

+1

Tôi tin rằng khuyến nghị là một vòng lặp sự kiện cho mỗi quá trình. Nếu một quá trình vòng lặp sự kiện duy nhất được tính toán bị ràng buộc, bạn có thể sao chép nó vào các quy trình khác đang chạy trên các lõi khác, như @leech đề xuất, nhưng bạn có thể tốt hơn chỉ nên tạo ra các tác vụ tính toán. Tôi tin rằng asyncio có một giao diện đa xử lý, mà tôi đã không, bất cứ lúc nào, nhìn vào. –

Trả lời

3

Cách thông thường để đối phó với điều này là bằng cách bắt đầu nhiều quá trình máy chủ (mỗi vòng lặp sự kiện riêng của mình), với cân bằng tải ở phía trước. Mỗi quá trình như vậy thường không thể sử dụng nhiều hơn một lõi CPU, vì vậy bạn có thể muốn có nhiều quy trình như bạn có lõi.

+0

Bạn có thể muốn ít nhất là nhiều quá trình như lõi. Tỷ lệ 1: 1 giả định mỗi quá trình hoàn toàn bị ràng buộc CPU. – acjay

+0

Nếu IO không đồng bộ thì quá trình thực sự phải là CPU bị ràng buộc. Bạn có dữ liệu cho thấy điều này không đúng không? (cũng có thể được, tôi đã không thực sự xác minh điều này trong một kịch bản sản xuất thực tế) – nikow

+0

Cảm ơn, tôi đồng ý đó là con đường để đi, đặc biệt xem xét tôi đang làm việc với kiến ​​trúc vi dịch vụ trong tâm trí. Bằng cách sử dụng Docker và có thể có hàng tá vùng chứa dịch vụ vi mô, tỷ lệ 1: 1 là không thể, nhưng tôi đồng ý với @acjay. Chúng tôi có thể là CPU bị ràng buộc (xem xét không đồng bộ IO), nhưng có thể vì mỗi container đại diện cho một phần rất nhỏ của hệ thống, chúng tôi có thể là tốt để đi ... tốt, điều này chắc chắn là một chủ đề để trang trải và thực hiện một số tiêu chuẩn. Cảm ơn thời gian của bạn anyway! –

0

Tôi đã làm điều này trước đây. Tôi thậm chí đã viết mã để theo dõi các quá trình tôi sinh ra. Nhưng hóa ra là Python & asyncio khá ổn định, tôi chưa bao giờ thấy một lỗi nghiêm trọng làm dừng toàn bộ vòng lặp sự kiện. Vì vậy, tôi không khuyên bạn nên sinh sản nhiều quy trình với mục đích duy nhất là tính khả dụng cao.

Mã này là ở đây nếu bạn quan tâm: https://github.com/l04m33/shinpachi

Bạn có thể muốn kiểm tra shinpachi/__init__.pyshinpachi/processes.py.

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