2012-07-23 31 views
7

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ả.

Trả lời

7

Nếu 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?

số

Liệu này có nghĩa là rằng bất kể một dịch vụ chăm sóc người dùng về kết quả, future.get_result cần phải được gọi nào chỉ để đảm bảo yêu cầu NDB được thực hiện?

Về cơ bản có, nhưng bạn có thể sử dụng trang trí ndb.toplevel để thuận tiện để bạn không phải chờ kết quả một cách rõ ràng. Điều đó nói rằng, tôi không nghĩ rằng đây là những gì bạn muốn.

Có thể taskqueue là những gì bạn muốn. Làm ơn hãy kiểm tra nó.

+3

Để 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ủ. –

1

Cảm ơn bạn đã giải thích rõ. Điều gì về một RPC chung (không phải NDB) - ví dụ: incr_async() trong memcache.Client()? Đặt sang một bên rằng đây là một cuộc gọi RPC rất, rất nhanh, có đảm bảo rằng RPC sẽ hoàn thành?

I.e., Mà những điều sau đây là đúng:

(a) có cái gì đó trong cơ sở hạ tầng mà sẽ chờ đợi trên tất cả các RPC biết trước khi hoàn tất các yêu cầu

(b) yêu cầu sẽ hoàn thành và RPC async cũng sẽ hoàn thành bất kể khi nào có yêu cầu hoàn

(c) trên máy bay RPC được chính thức hủy

(d) cái gì khác?

+1

Vui lòng đăng các cập nhật như thế này dưới dạng nhận xét, chỉnh sửa cho câu hỏi của bạn hoặc câu hỏi mới - chỉ câu trả lời mới được đăng là câu trả lời. –

+1

Câu trả lời cho câu hỏi của bạn, tuy nhiên, là (a). –

Các vấn đề liên quan