Tôi đang sử dụng ndb để viết một mô hình lược tả ghi lại một số dữ liệu cho mỗi yêu cầu ứng dụng. Mỗi yêu cầu gọi một yêu cầu ndb bằng ndb.put_async để ghi dữ liệu, trong khi máy khách không quan tâm đến kết quả. Về bản chất, tôi không muốn yêu cầu ứng dụng phải chờ để lưu dữ liệu thống kê để lược tả.Có phải ndb async được bảo đảm thực hiện sau khi yêu cầu ứng dụng đã kết thúc không?
Tuy nhiên, tôi đã nhầm lẫn về giải thích từ tài liệu chính thức. Nếu một yêu cầu ứng dụng đã hoàn tất trước khi yêu cầu ndb kết thúc, yêu cầu ndb vẫn được đảm bảo hoàn thành? Các tài liệu cho thấy rằng
nếu xử lý yêu cầu tồn tại quá sớm, giao dịch thỏa thuận có thể không bao giờ xảy ra
Theo những tiêu chuẩn này sẽ xảy ra? Điều này có nghĩa là bất kể người dùng có quan tâm đến kết quả không, chỉ cần gọi hàm future.get_result để đảm bảo yêu cầu ndb được thực hiện?
Các tài liệu gốc (https://developers.google.com/appengine/docs/python/ndb/async) nói:
Trong ví dụ này, đó là một chút ngớ ngẩn để gọi future.get_result: ứng dụng không bao giờ sử dụng kết quả từ NDB. Mã đó chỉ ở trong đó để đảm bảo rằng trình xử lý yêu cầu không thoát trước khi NDB đặt kết thúc; nếu trình xử lý yêu cầu thoát quá sớm, việc đặt có thể không bao giờ xảy ra . Để thuận tiện, bạn có thể trang trí trình xử lý yêu cầu với @ ndb.toplevel. Điều này yêu cầu trình xử lý không thoát ra cho đến khi các yêu cầu không đồng bộ hoàn tất. Điều này cho phép bạn gửi yêu cầu và không phải lo lắng về kết quả.
Để làm rõ, lý do đặt có thể không xảy ra là tính năng tự động định lượng của NDB. Tương lai đại diện cho đặt có thể được ngồi trong hàng đợi tự động của lô, và trang trí @ ndb.toplevel là cách chắc chắn duy nhất (ngoài việc gọi một cách rõ ràng get_result()) để đảm bảo rằng tất cả các yêu cầu đặt trong hàng đợi như vậy được gửi đến máy chủ. –