Xét đoạn mã sau trong ứng dụng WebApp2 của tôi trong Google App Engine:Hiểu kiên trì đối tượng toàn cầu trong Python WSGI apps
count = 0
class MyHandler(webapp2.RequestHandler):
def get(self):
global count
count = count + 1
print count
Với mỗi refresh của trang, các gia số đếm cao hơn.
Tôi đến từ thế giới PHP, nơi mọi yêu cầu đều là môi trường toàn cầu mới. Những gì tôi hiểu được đang xảy ra ở đây là, bởi vì tôi đang sử dụng cấu hình wsgi cho WebApp2, Python không khởi động một quy trình mới trên mỗi yêu cầu. Nếu tôi đang sử dụng cấu hình cgi, mặt khác, môi trường toàn cầu sẽ tái khởi tạo mỗi lần, như PHP ...
Giả sử ở trên là chính xác (Nếu không, hãy sửa tôi) ...
- Làm cách nào để xử lý các tình huống mà tôi muốn biến toàn cầu chỉ tồn tại trong suốt thời gian yêu cầu? Tôi có thể đặt một biến cá thể trong lớp RequestHandler, nhưng những thứ như các mô-đun tiện ích mà tôi nhập khẩu sử dụng các vars toàn cầu cho những thứ như lưu trữ một đối tượng tin nhắn là gì?
- Có một số loại kỹ thuật để đặt lại tất cả các biến hoặc để buộc tái tạo lại môi trường không?
- Môi trường toàn cầu có tồn tại vô thời hạn hay không tự động đặt lại ở một thời điểm nào đó?
- Có bất kỳ GAE cụ thể nào không hoặc việc duy trì toàn cầu wsgi có hoạt động giống nhau trong bất kỳ kịch bản máy chủ nào không?
EDIT:
Dưới đây là một nỗ lực sử dụng ThreadLocal:
count = 0
mydata = threading.local()
mydata.count = 0
class MyHandler(webapp2.RequestHandler):
def get(self):
global count
count = count + 1
print count
mydata.count = mydata.count + 1
print mydata.count
Đây cũng tăng trên yêu cầu
Có lý do cụ thể nào bạn đang cố gắng lưu trữ dữ liệu chung bên ngoài kho dữ liệu không? Có vẻ như những gì bạn đang cố gắng có thể được thực hiện dễ dàng hơn với một [truy cập bị hỏng] (http://code.google.com/appengine/articles/sharding_counters.html). –
@ Kevin- biến số đó chỉ là một ví dụ - trường hợp thực tế của tôi hoàn toàn khác - tôi chỉ đang cố gắng hiểu phạm vi toàn cầu trong miền ứng dụng. – Yarin
Related [Tại sao giá treo sử dụng StackedObjectProxies thay vì threading.local?] (Http://stackoverflow.com/q/1686768/95735) –