Gần đây tôi đã đọc this document liệt kê một số chiến lược có thể được sử dụng để triển khai máy chủ socket. Cụ thể, đó là:Viết một máy chủ dựa trên socket trong Python, các chiến lược được khuyến nghị?
- Phục vụ nhiều khách hàng với mỗi chủ đề, và sử dụng nonblocking I/O và thông báo sẵn sàng cấp kích hoạt
- Phục vụ nhiều khách hàng với mỗi chủ đề, và sử dụng nonblocking I/O và sự sẵn sàng thay đổi thông báo
- phục vụ nhiều khách hàng với mỗi thread máy chủ, và sử dụng không đồng bộ I/O
- phục vụ một khách hàng với mỗi thread máy chủ, và sử dụng blocking I/O
- Xây dựng mã máy chủ vào kernel
Bây giờ, tôi sẽ đánh giá cao một gợi ý mà nên được sử dụng trong CPython, mà chúng ta biết có một số điểm tốt, và một số điểm xấu. Tôi chủ yếu quan tâm đến hiệu năng theo đồng thời cao, và có một số hiện thực hiện tại quá chậm.
Vì vậy, nếu tôi có thể bắt đầu bằng cách dễ dàng, "5" là ra, như tôi sẽ không được hack bất cứ điều gì vào hạt nhân.
"4" Cũng có vẻ như nó phải nằm ngoài GIL. Tất nhiên, bạn có thể sử dụng đa xử lý thay cho các chủ đề ở đây, và điều đó làm tăng đáng kể. Chặn IO cũng có lợi thế là dễ hiểu hơn.
Và đây kiến thức của tôi suy yếu một chút:
"1" là truyền thống chọn hoặc thăm dò có thể được trivially kết hợp với đa xử lý.
"2" là thông báo sự sẵn sàng thay đổi, được sử dụng bởi epoll mới hơn và kqueue
"3" Tôi không chắc chắn có bất kỳ triển khai hạt nhân cho điều này có wrappers Python.
Vì vậy, trong Python, chúng tôi có một túi các công cụ tuyệt vời như Twisted. Có lẽ họ là một cách tiếp cận tốt hơn, mặc dù tôi đã chuẩn bị cho Twisted và thấy nó quá chậm trên một máy xử lý đa. Có lẽ có 4 xoắn với một cân bằng tải có thể làm điều đó, tôi không biết. Lời khuyên nào sẽ được đánh giá cao.
Tôi nghĩ epoll là trong stdlib trong 2.6+, và easy_installable cho 2.5. Gói được gọi là select-something. Xin lỗi vì sự mơ hồ. –
Xoắn cũng có thể sử dụng epoll. Trong thực tế, Twisted biến tất cả các API thông báo sự kiện được hỗ trợ thành một API đồng bộ mà nó trình bày cho bạn. Vì vậy, nếu tốt nhất nền tảng có thể làm là chọn, ứng dụng của bạn sử dụng lựa chọn. Nếu nó có epoll, ứng dụng của bạn sử dụng epoll. Tất cả đều trong suốt cho bạn. –
Nó được viết là 'asyncore' – new123456