Ví dụ về bộ đệm trong Python
Khi những người nói các ngôn ngữ khác nhau gặp nhau và nói chuyện, họ cố gắng sử dụng ngôn ngữ mà mọi người trong nhóm đều hiểu Show
Để đạt được điều này, mọi người phải dịch những suy nghĩ của họ, thường là bằng ngôn ngữ mẹ đẻ của họ, sang ngôn ngữ của nhóm. Tuy nhiên, việc “mã hóa và giải mã” ngôn ngữ này dẫn đến mất hiệu quả, tốc độ và độ chính xác Mục lụcTại sao lại là bộ đệm giao thức?Mục đích ban đầu của Bộ đệm giao thức là đơn giản hóa công việc với các giao thức yêu cầu/phản hồi. Trước ProtoBuf, Google đã sử dụng một định dạng khác yêu cầu xử lý bổ sung đối với các thư được gửi Ngoài ra, các phiên bản mới của định dạng trước đó yêu cầu các nhà phát triển đảm bảo rằng các phiên bản mới được hiểu trước khi thay thế các phiên bản cũ, khiến việc làm việc với nó trở nên phức tạp. Chi phí này đã thúc đẩy Google thiết kế một giao diện giải quyết chính xác những vấn đề đó ProtoBuf cho phép thay đổi giao thức được giới thiệu mà không vi phạm tính tương thích. Ngoài ra, các máy chủ có thể truyền dữ liệu và thực hiện các thao tác đọc trên dữ liệu mà không sửa đổi nội dung của nó Do định dạng có phần tự mô tả, ProtoBuf được sử dụng làm cơ sở để tạo mã tự động cho Bộ nối tiếp và Bộ giải mã Một trường hợp sử dụng thú vị khác là cách Google sử dụng nó cho các Lệnh gọi thủ tục từ xa (RPC) trong thời gian ngắn và để lưu trữ dữ liệu liên tục trong Bigtable. Do trường hợp sử dụng cụ thể của họ, họ đã tích hợp giao diện RPC vào ProtoBuf. Điều này cho phép tạo mã sơ khai nhanh chóng và đơn giản, có thể được sử dụng làm điểm khởi đầu cho việc triển khai thực tế. (Thông tin thêm về ProtoBuf RPC. ) Các ví dụ khác về nơi ProtoBuf có thể hữu ích là dành cho các thiết bị IoT được kết nối qua mạng di động trong đó lượng dữ liệu được gửi phải được giữ ở mức nhỏ hoặc cho các ứng dụng ở các quốc gia vẫn còn hiếm băng thông cao. Gửi tải trọng ở định dạng nhị phân, được tối ưu hóa có thể dẫn đến sự khác biệt đáng chú ý về chi phí và tốc độ vận hành Sử dụng tính năng nén Bộ đệm giao thức là gì và chúng hoạt động như thế nào?Nói chung, Bộ đệm giao thức là một giao diện được xác định để tuần tự hóa dữ liệu có cấu trúc. Nó xác định một cách giao tiếp chuẩn hóa, hoàn toàn độc lập với ngôn ngữ và nền tảng Google quảng cáo ProtoBuf của mình như thế này Bộ đệm giao thức là cơ chế có thể mở rộng, trung lập về ngôn ngữ, nền tảng và có thể mở rộng của Google để tuần tự hóa dữ liệu có cấu trúc – ví dụ như XML, nhưng nhỏ hơn, nhanh hơn và đơn giản hơn. Bạn xác định cách bạn muốn dữ liệu của mình được cấu trúc một lần… Giao diện ProtoBuf mô tả cấu trúc của dữ liệu được gửi. Cấu trúc tải trọng được định nghĩa là "thông báo" trong cái được gọi là Proto-Files. Những tệp đó luôn kết thúc bằng phần mở rộng
Các tệp đó sau đó được sử dụng để tạo các lớp tích hợp hoặc sơ khai cho ngôn ngữ bạn chọn bằng cách sử dụng trình tạo mã trong trình biên dịch protoc. Phiên bản hiện tại, Proto3, đã hỗ trợ tất cả các ngôn ngữ lập trình chính. Cộng đồng hỗ trợ nhiều hơn nữa trong việc triển khai nguồn mở của bên thứ ba Các lớp được tạo là các thành phần cốt lõi của Bộ đệm giao thức. Chúng cho phép tạo các phần tử bằng cách khởi tạo các thông báo mới, dựa trên các tệp Không phụ thuộc vào ngôn ngữ để tuần tự hóa, các thông báo được tuần tự hóa thành định dạng nhị phân, không tự mô tả, khá vô dụng nếu không có định nghĩa cấu trúc ban đầu Sau đó, dữ liệu nhị phân có thể được lưu trữ, gửi qua mạng và sử dụng bất kỳ cách nào khác mà con người có thể đọc được dữ liệu như JSON hoặc XML. Sau khi truyền hoặc lưu trữ, luồng byte có thể được giải tuần tự hóa và khôi phục bằng cách sử dụng bất kỳ lớp protobuf được biên dịch, dành riêng cho ngôn ngữ nào mà chúng tôi tạo ra từ. tập tin proto Đầu tiên, chúng tôi tạo một danh sách việc cần làm mới và điền vào đó một số nhiệm vụ. Danh sách việc cần làm này sau đó được đánh số thứ tự và gửi qua mạng, được lưu trong một tệp hoặc được lưu trữ liên tục trong cơ sở dữ liệu Luồng byte đã gửi được giải tuần tự hóa bằng cách sử dụng phương thức phân tích cú pháp của lớp được biên dịch theo ngôn ngữ cụ thể của chúng tôi Thay vì các giao thức chi phí cao, chúng ta có thể sử dụng một cách nhanh chóng và nhỏ gọn để di chuyển dữ liệu giữa các thực thể khác nhau vào dịch vụ của mình mà không lãng phí nhiều tài nguyên Nhưng tại sao nó không được sử dụng ở mọi nơi?Bộ đệm giao thức phức tạp hơn một chút so với các định dạng khác mà con người có thể đọc được. Điều này làm cho chúng khó gỡ lỗi và tích hợp vào các ứng dụng của bạn hơn. Thời gian lặp lại trong kỹ thuật cũng có xu hướng tăng lên do các bản cập nhật trong dữ liệu yêu cầu cập nhật các tệp proto trước khi sử dụng Cần phải cân nhắc cẩn thận vì ProtoBuf có thể là một giải pháp được thiết kế quá mức trong nhiều trường hợp Tôi có những lựa chọn thay thế nào?Một số dự án có cách tiếp cận tương tự với Bộ đệm giao thức của Google Bộ đệm phẳng của Google và triển khai của bên thứ ba, được gọi là Cap'n Proto, tập trung hơn vào việc loại bỏ bước phân tích cú pháp và giải nén, điều cần thiết để truy cập dữ liệu thực tế khi sử dụng ProtoBufs. Chúng đã được thiết kế rõ ràng cho các ứng dụng quan trọng về hiệu suất, khiến chúng thậm chí còn nhanh hơn và tiết kiệm bộ nhớ hơn so với ProtoBuf Bộ đệm giao thức và PythonPython đã cung cấp một số cách duy trì dữ liệu bằng cách sử dụng phương pháp tẩy. Pickling rất hữu ích trong các ứng dụng chỉ dành cho Python. Nó không phù hợp lắm với các tình huống phức tạp hơn khi có liên quan đến việc chia sẻ dữ liệu với các ngôn ngữ khác hoặc thay đổi lược đồ Để biên dịch tệp
Khi chúng tôi đã cài đặt protoc trên hệ thống của mình, chúng tôi có thể sử dụng một ví dụ mở rộng về cấu trúc danh sách việc cần làm của chúng tôi từ trước đó và tạo lớp tích hợp Python từ nó
Hãy xem chi tiết hơn về cấu trúc của tệp Các phần tử không phổ biến nhất của tệp proto là các số được gán cho từng thực thể của thư. Các số chuyên dụng đó làm cho mỗi thuộc tính trở thành duy nhất và được sử dụng để xác định các trường được chỉ định trong đầu ra được mã hóa nhị phân Một khái niệm quan trọng cần nắm bắt là chỉ các giá trị 1-15 được mã hóa bằng một byte nhỏ hơn (Hex), điều này rất hữu ích để hiểu để chúng ta có thể gán các số cao hơn cho các thực thể ít được sử dụng hơn. Các số không xác định thứ tự mã hóa cũng như vị trí của thuộc tính đã cho trong thông báo được mã hóa Định nghĩa gói giúp ngăn xung đột tên. Trong Python, các gói được xác định bởi thư mục của chúng. Do đó, việc cung cấp thuộc tính gói không có bất kỳ ảnh hưởng nào đến mã Python được tạo Xin lưu ý rằng điều này vẫn nên được khai báo để tránh xung đột tên liên quan đến bộ đệm giao thức và cho các ngôn ngữ khác như Java Phép liệt kê là danh sách đơn giản các giá trị có thể có cho một biến nhất định Để tạo mã tích hợp có thể sử dụng được, chúng tôi sử dụng trình biên dịch proto để biên dịch một mã đã cho. tệp proto vào các lớp tích hợp dành riêng cho ngôn ngữ. Trong trường hợp của chúng tôi, chúng tôi sử dụng đối số --python-out để tạo mã dành riêng cho Python 4Trong thiết bị đầu cuối, chúng tôi gọi trình biên dịch giao thức với ba tham số
Điều này là do trình tạo không tạo ra các phần tử truy cập dữ liệu trực tiếp, nhưng tiếp tục trừu tượng hóa sự phức tạp bằng cách sử dụng siêu dữ liệu và bộ mô tả cho từng thuộc tính. Chúng mô tả cách một lớp hành xử thay vì từng thể hiện của lớp đó
Nó chỉ tạo một danh sách việc cần làm mới và thêm một mục vào đó. Sau đó, chúng tôi in chính thành phần danh sách việc cần làm và có thể thấy phiên bản dữ liệu không nhị phân, không tuần tự hóa mà chúng tôi vừa xác định trong tập lệnh của mình
Mỗi lớp Bộ đệm giao thức có các phương thức để đọc và viết tin nhắn bằng mã hóa dành riêng cho Bộ đệm giao thức, mã hóa tin nhắn thành định dạng nhị phân 5 và 6
Trong ví dụ mã ở trên, chúng tôi viết chuỗi byte được tuần tự hóa vào một tệp bằng cờ wb Vì chúng tôi đã ghi tệp, chúng tôi có thể đọc lại nội dung và Phân tích cú pháp bằng ParseFromString. ParseFromString gọi một phiên bản mới của lớp Serialized của chúng tôi bằng cách sử dụng các cờ rb và phân tích cú pháp nó Nếu chúng tôi tuần tự hóa thông báo này và in nó trong bảng điều khiển, chúng tôi sẽ nhận được biểu diễn byte giống như thế này 7Lưu ý b trước dấu ngoặc kép. Điều này chỉ ra rằng chuỗi sau bao gồm các byte octet trong Python Nếu chúng ta so sánh trực tiếp điều này với, e. g. , XML, chúng ta có thể thấy tác động của tuần tự hóa ProtoBuf đối với kích thước
Biểu diễn JSON, không xấu xí, sẽ trông như thế này
Chỉ đánh giá các định dạng khác nhau bằng tổng số byte được sử dụng, bỏ qua bộ nhớ cần thiết cho chi phí định dạng, tất nhiên chúng ta có thể thấy sự khác biệt Không có Schema, chúng tôi cần thêm 136 byte trong JSON để định dạng dữ liệu tuần tự hóa Nếu chúng ta đang nói về hàng nghìn tin nhắn được gửi qua mạng hoặc được lưu trữ trên đĩa, thì ProtoBuf có thể tạo ra sự khác biệt Tuy nhiên, có một nhược điểm. Nền tảng Auth0. com đã tạo ra một so sánh mở rộng giữa ProtoBuf và JSON. Nó cho thấy rằng, khi được nén, sự khác biệt về kích thước giữa hai loại có thể là không đáng kể (chỉ khoảng 9%) Nếu bạn quan tâm đến những con số chính xác, vui lòng tham khảo toàn bộ bài viết, trong đó đưa ra phân tích chi tiết về một số yếu tố như kích thước và tốc độ Một lưu ý thú vị là mỗi loại dữ liệu có một giá trị mặc định. Nếu các thuộc tính không được gán hoặc thay đổi, chúng sẽ duy trì các giá trị mặc định. Trong trường hợp của chúng tôi, nếu chúng tôi không thay đổi TaskState của một ListItem, nó sẽ có trạng thái là “TASK_OPEN” theo mặc định. Ưu điểm đáng kể của điều này là các giá trị không được đặt không được đánh số thứ tự, tiết kiệm thêm dung lượng Ví dụ: nếu chúng tôi thay đổi trạng thái của tác vụ từ TASK_DONE thành TASK_OPEN, thì tác vụ đó sẽ không được tuần tự hóa
8Ghi chú cuối cùngNhư chúng ta đã thấy, Bộ đệm giao thức khá tiện dụng khi nói đến tốc độ và hiệu quả khi làm việc với dữ liệu. Do tính chất mạnh mẽ của nó, có thể mất một thời gian để làm quen với hệ thống ProtoBuf, mặc dù cú pháp xác định thông báo mới rất đơn giản Lưu ý cuối cùng, tôi muốn chỉ ra rằng đã có/đang có các cuộc thảo luận về việc liệu Bộ đệm giao thức có “hữu ích” cho các ứng dụng thông thường hay không. Chúng được phát triển rõ ràng cho các vấn đề mà Google đã lưu ý QUẢNG CÁO QUẢNG CÁO QUẢNG CÁO QUẢNG CÁO QUẢNG CÁO QUẢNG CÁO QUẢNG CÁO QUẢNG CÁO QUẢNG CÁO QUẢNG CÁO QUẢNG CÁO QUẢNG CÁO Người học đam mê và nhà phát triển quan tâm đến tự động hóa. Sử dụng Scratch để dạy viết mã cho trẻ em trong các hội thảo tại thư viện thành phố địa phương. Người đam mê mã nguồn mở. Người tạo InstaPy Nếu bạn đọc đến đây, hãy tweet cho tác giả để cho họ thấy bạn quan tâm. Tweet một lời cảm ơn Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu bộ đệm trong Python với ví dụ là gì?Cấu trúc bộ đệm (hoặc đơn giản là “bộ đệm”) hữu ích vì một cách để hiển thị dữ liệu nhị phân từ một đối tượng khác cho lập trình viên Python . Chúng cũng có thể được sử dụng như một cơ chế cắt không sao chép. Sử dụng khả năng tham chiếu một khối bộ nhớ của họ, có thể hiển thị bất kỳ dữ liệu nào cho lập trình viên Python khá dễ dàng.
Bộ đệm trong lập trình là gì?Bộ đệm là một vùng bộ nhớ được sử dụng để tạm thời giữ dữ liệu trong khi dữ liệu được di chuyển từ nơi này sang nơi khác . Bộ đệm được sử dụng khi di chuyển dữ liệu giữa các quy trình trong máy tính.
Bộ đệm có kích thước trong Python là gì?Kích thước của bộ đệm được chọn tùy thuộc vào “kích thước khối” của thiết bị bên dưới. Trên nhiều hệ thống, bộ đệm thường dài 4096 hoặc 8192 byte .
Bộ đệm nội bộ trong Python là gì?Mục đích của bộ đệm bên trong, được tạo bởi thời gian chạy, thư viện và ngôn ngữ lập trình mà bạn đang sử dụng, là để tăng tốc hoạt động bằng cách ngăn các cuộc gọi hệ thống trên mỗi lần ghi . . |