Một (lâu) trong khi trước đây tôi đã viết một mạng nhện mà tôi đã đa luồng để cho phép các yêu cầu đồng thời xảy ra cùng một lúc. Đó là thời trẻ Python của tôi, vào những ngày trước khi tôi biết về GIL và những tai ương liên quan mà nó tạo ra cho mã đa luồng (IE, hầu hết các công cụ thời gian chỉ kết thúc nối tiếp!) ...
Tôi muốn làm lại mã này để làm cho nó mạnh hơn và hoạt động tốt hơn. Về cơ bản có hai cách tôi có thể làm điều này: tôi có thể sử dụng mô-đun đa xử lý mới trong 2.6+ hoặc tôi có thể sử dụng mô hình dựa trên sự kiện / lò phản ứng. Tôi thà làm sau này vì nó đơn giản hơn và ít bị lỗi hơn.
Vì vậy, câu hỏi liên quan đến khuôn khổ nào sẽ phù hợp nhất với nhu cầu của tôi. Sau đây là danh sách các tùy chọn tôi biết cho đến nay:
- Twisted : Các ông lớn của khung lò phản ứng Python: có vẻ phức tạp và hơi phình to. Dốc học đường cho một nhiệm vụ nhỏ.
- Eventlet : Từ những kẻ ở lindenlab . Khung dựa trên Greenlet hướng đến các loại nhiệm vụ này. Tôi đã xem mã mặc dù và nó không quá đẹp: không tuân thủ pep8, rải rác với các bản in (tại sao mọi người làm điều này trong một khung!?), API có vẻ hơi không nhất quán.
- PyEv : Chưa trưởng thành, dường như không có ai sử dụng nó ngay bây giờ mặc dù nó dựa trên sự hời hợt nên nó có một phần phụ trợ vững chắc.
- asyncore : Từ stdlib: über cấp thấp, có vẻ như rất nhiều công việc liên quan chỉ để có được một cái gì đó lên khỏi mặt đất.
- tornado : Mặc dù đây là một sản phẩm hướng máy chủ được thiết kế cho các trang web động của máy chủ nhưng nó có tính năng máy khách HTTP không đồng bộ và ioloop đơn giản . Có vẻ như nó có thể hoàn thành công việc nhưng không phải là những gì nó được dự định. [sửa: không may chạy trên Windows, điều này không phù hợp với tôi - đó là yêu cầu đối với tôi để hỗ trợ nền tảng khập khiễng này]
Có bất cứ điều gì tôi đã bỏ lỡ tất cả? Chắc chắn phải có một thư viện ngoài kia phù hợp với vị trí ngọt ngào của thư viện mạng không đồng bộ được đơn giản hóa!
[chỉnh sửa: lớn nhờ intgr cho con trỏ của mình đến trang này . Nếu bạn cuộn xuống phía dưới, bạn sẽ thấy có một danh sách các dự án thực sự tốt đẹp nhằm giải quyết nhiệm vụ này bằng cách này hay cách khác. Có vẻ như mọi thứ thực sự đã tiến lên kể từ khi bắt đầu Twisted: mọi người dường như ủng hộ một giải pháp dựa trên đồng quy hơn là một lò phản ứng / gọi lại theo định hướng truyền thống. Lợi ích của cách tiếp cận này là mã trực tiếp rõ ràng hơn: Tôi chắc chắn đã tìm thấy trong quá khứ, đặc biệt là khi làm việc với boost.asiotrong C ++, mã dựa trên gọi lại có thể dẫn đến các thiết kế có thể khó theo dõi và tương đối khó hiểu đối với mắt không được đào tạo. Sử dụng đồng quy cho phép bạn viết mã trông ít đồng bộ hơn một chút. Tôi đoán bây giờ nhiệm vụ của tôi là tìm ra một trong những thư viện mà tôi thích giao diện này và cho nó đi! Vui mừng tôi đã hỏi bây giờ ...]
[sửa: có lẽ quan tâm đến bất kỳ ai theo dõi hoặc vấp phải câu hỏi này hoặc quan tâm đến chủ đề này theo bất kỳ ý nghĩa nào: Tôi đã tìm thấy một bài viết thực sự tuyệt vời về tình trạng hiện tại của các công cụ có sẵn cho công việc này]
select
cho ghép kênh I / O. Nhưng bạn sẽ có thể có được một hiệu suất tốt từ nó với tornado-pyuv . 2. Hiện nay, asyncio bằng Python 3.3+ và backport nó trollius cho phép để chạy bất kỳ ứng dụng Tornado trong vòng lặp sự kiện của nó (Twisted sẽ được hỗ trợ sớm).