Bộ ba Python vs asyncio

Hôm nay, tôi đã tìm thấy một thư viện có tên là bộ ba, thư viện này nói rằng chính nó là một API không đồng bộ dành cho con người. Những từ này hơi giống với requests'. Vì requests thực sự là một thư viện tốt, tôi tự hỏi những ưu điểm của trio là gì

Không có nhiều bài viết về nó, tôi chỉ tìm thấy một bài báo thảo luận về curioasyncio. Trước sự ngạc nhiên của tôi, trio nói rằng bản thân nó thậm chí còn tốt hơn cả curio (đồ cổ thế hệ tiếp theo)

Sau khi đọc một nửa bài viết, tôi không thể tìm thấy sự khác biệt cốt lõi giữa hai khung không đồng bộ này. Nó chỉ đưa ra một số ví dụ rằng việc triển khai của curio thuận tiện hơn của asyncio. Nhưng cấu trúc cơ bản gần như giống nhau

Vì vậy, ai đó có thể cho tôi lý do để tôi phải chấp nhận rằng trio hoặc curio tốt hơn asyncio không?

tôi đến từ đâu. Tôi là tác giả chính của bộ ba. Tôi cũng là một trong những người đóng góp hàng đầu cho curio (và đã viết bài báo về nó mà bạn liên kết đến) và là một nhà phát triển cốt lõi của Python, người đã tham gia rất nhiều vào các cuộc thảo luận về cách cải thiện asyncio

Trong bộ ba (và curio), một trong những nguyên tắc thiết kế cốt lõi là bạn không bao giờ lập trình với các cuộc gọi lại; . Tôi đoán nếu bạn mở mui xe và xem cách chúng được triển khai trong nội bộ, thì sẽ có những nơi chúng sử dụng lệnh gọi lại hoặc những thứ tương đương với lệnh gọi lại nếu bạn nheo mắt. Nhưng điều đó giống như nói rằng Python và C tương đương nhau vì trình thông dịch Python được triển khai trong C. Bạn không bao giờ sử dụng gọi lại

Dù sao thì

Asyncio trưởng thành hơn

Sự khác biệt lớn đầu tiên là sự trưởng thành của hệ sinh thái. Vào thời điểm tôi viết bài này vào tháng 3 năm 2018, có nhiều thư viện hỗ trợ asyncio hơn là hỗ trợ bộ ba. Ví dụ: hiện tại không có bất kỳ máy chủ HTTP thực nào có hỗ trợ bộ ba. Cơ cấu. Trình phân loại AsyncIO trên PyPI hiện có 122 thư viện trong đó, trong khi Framework. Phân loại bộ ba chỉ có 8. Tôi hy vọng rằng phần này của câu trả lời sẽ nhanh chóng lỗi thời – ví dụ: đây là Kenneth Reitz đang thử nghiệm thêm hỗ trợ bộ ba trong phiên bản tiếp theo của yêu cầu – nhưng ngay bây giờ, bạn nên mong đợi điều đó nếu bạn là bộ ba cho bất cứ điều gì . (Kênh trò chuyện của bộ ba rất hữu ích để tìm hiểu về những gì có sẵn và những gì người khác đang làm. )

Bộ ba làm cho mã của bạn đơn giản hơn

Xét về các thư viện thực tế, chúng cũng rất khác nhau. Đối số chính cho bộ ba là nó làm cho việc viết mã đồng thời đơn giản hơn nhiều so với sử dụng asyncio. Tất nhiên, lần cuối cùng bạn nghe ai đó nói rằng thư viện của họ khiến mọi thứ khó sử dụng hơn là khi nào. để tôi đưa ra một ví dụ cụ thể. Trong bài nói chuyện này (slide), tôi sử dụng ví dụ triển khai RFC 8305 "Happy eyeballs", đây là một thuật toán đồng thời đơn giản được sử dụng để thiết lập kết nối mạng một cách hiệu quả. Đây là điều mà Glyph đã suy nghĩ trong nhiều năm và phiên bản mới nhất của anh ấy cho Twisted dài ~600 dòng. (Asyncio sẽ giống nhau; Twisted và asyncio rất giống nhau về mặt kiến ​​trúc. ) Trong buổi nói chuyện, tôi dạy bạn mọi thứ bạn cần biết để triển khai nó trong <40 dòng bằng cách sử dụng bộ ba (và chúng tôi đã sửa một lỗi trong phiên bản của anh ấy khi chúng tôi đang ở đó). Vì vậy, trong ví dụ này, việc sử dụng bộ ba thực sự làm cho mã của chúng ta trở nên đơn giản hơn

Bạn cũng có thể thấy những nhận xét này từ người dùng thú vị. 1, 2, 3

Có rất nhiều sự khác biệt về chi tiết

Lý do tại sao điều này xảy ra? . -). Tôi đang dần dần viết ra các phần khác nhau trong các bài đăng trên blog và các cuộc nói chuyện và tôi sẽ cố gắng cập nhật câu trả lời này bằng các liên kết khi chúng có sẵn. Về cơ bản, Trio có một tập hợp nhỏ các nguyên mẫu được thiết kế cẩn thận, có một vài điểm khác biệt cơ bản so với bất kỳ thư viện nào khác mà tôi biết (mặc dù tất nhiên là dựa trên ý tưởng từ nhiều nơi). Dưới đây là một số ghi chú ngẫu nhiên để cung cấp cho bạn một số ý tưởng

Một vấn đề rất, rất phổ biến trong asyncio và các thư viện liên quan là bạn gọi requests4 và nó trả về, vì vậy bạn nghĩ rằng nó đã hoàn thành – nhưng thực ra nó vẫn đang chạy trong nền. Điều này dẫn đến tất cả các loại lỗi phức tạp, vì nó gây khó khăn cho việc kiểm soát thứ tự xảy ra hoặc biết khi nào mọi thứ thực sự kết thúc và nó có thể trực tiếp che giấu các vấn đề vì nếu một tác vụ nền gặp sự cố với một ngoại lệ chưa được xử lý, asyncio sẽ . Trong bộ ba, cách chúng tôi xử lý nhiệm vụ sinh sản thông qua "vườn ươm" có nghĩa là không có điều nào trong số này xảy ra. khi một hàm trả về thì bạn biết nó đã hoàn thành và Trio hiện là thư viện đồng thời duy nhất cho Python nơi các ngoại lệ luôn lan truyền cho đến khi bạn bắt được chúng

Cách quản lý thời gian chờ và hủy của Trio là mới lạ và tôi nghĩ tốt hơn các hệ thống hiện đại trước đây như C# và Golang. Tôi thực sự đã viết cả một bài luận về điều này, vì vậy tôi sẽ không đi vào tất cả các chi tiết ở đây. Nhưng hệ thống hủy bỏ của asyncio - hay thực sự là các hệ thống, nó có hai trong số chúng với ngữ nghĩa hơi khác nhau - dựa trên một bộ ý tưởng cũ hơn cả C# và Golang, và rất khó sử dụng chính xác. (Ví dụ: rất dễ để mã vô tình "thoát" một lệnh hủy bằng cách tạo ra một tác vụ nền; xem đoạn trước. )

Có rất nhiều thứ dư thừa trong asyncio, điều này có thể khiến bạn khó biết nên sử dụng thứ nào khi. Bạn có tương lai, nhiệm vụ và coroutine, về cơ bản tất cả đều được sử dụng cho cùng một mục đích nhưng bạn cần biết sự khác biệt giữa chúng. Nếu bạn muốn triển khai một giao thức mạng, bạn phải chọn sử dụng lớp giao thức/vận chuyển hay lớp luồng và cả hai đều có những cạm bẫy phức tạp (đây là nội dung của phần đầu tiên của bài tiểu luận mà bạn đã liên kết)

Trio hiện là thư viện đồng thời duy nhất cho Python nơi control-C chỉ hoạt động theo cách bạn mong đợi (i. e. , nó sẽ tăng requests5 cho dù mã của bạn ở đâu). Đó là một điều nhỏ, nhưng nó tạo nên sự khác biệt lớn. -). Vì nhiều lý do, tôi không nghĩ rằng điều này có thể sửa được trong asyncio

Nếu bạn cần vận chuyển thứ gì đó để sản xuất vào tuần tới, thì bạn nên sử dụng asyncio (hoặc Twisted hoặc Tornado hoặc gevent, thậm chí còn hoàn thiện hơn). Họ có hệ sinh thái rộng lớn, những người khác đã sử dụng chúng trong sản xuất trước bạn và họ sẽ không đi đâu cả

Nếu việc cố gắng sử dụng những khuôn khổ đó khiến bạn thất vọng và bối rối, hoặc nếu muốn thử nghiệm một cách làm việc khác, thì chắc chắn hãy xem bộ ba – chúng tôi rất thân thiện. -)

Nếu bạn muốn vận chuyển một cái gì đó để sản xuất một năm kể từ bây giờ. sau đó tôi không biết phải nói gì với bạn. Đồng thời Python đang thay đổi. Bộ ba có nhiều lợi thế ở cấp độ thiết kế, nhưng điều đó có đủ để vượt qua sự khởi đầu của asyncio không? . ) Có bao nhiêu ý tưởng mới trong bộ ba có thể được thêm vào asyncio? . Tôi hy vọng rằng sẽ có nhiều cuộc thảo luận thú vị về vấn đề này tại PyCon năm nay. -)

Là bộ ba tốt hơn asyncio?

Bộ ba giúp mã của bạn đơn giản hơn .

Bộ ba Python là gì?

Trio là thư viện Python hiện đại để viết các ứng dụng không đồng bộ – nghĩa là các chương trình muốn thực hiện nhiều việc cùng lúc với các ứng dụng song song .

Asyncio có nhanh hơn không?

Ví dụ. Asyncio sẽ hoạt động xung quanh khóa trình thông dịch toàn cầu. Asyncio nhanh hơn các luồng .

Tại sao Asyncio nhanh hơn?

Và nói chung, phương pháp asyncio sẽ luôn nhanh hơn một chút so với phương pháp luồng. Điều này là do khi chúng tôi sử dụng cú pháp "chờ đợi", về cơ bản chúng tôi nói với chương trình của mình "chờ đã, tôi sẽ quay lại ngay", nhưng chương trình của chúng tôi theo dõi xem chúng tôi mất bao lâu để . .