2012-09-02 36 views
8

Tôi có trường hợp sử dụng sau cho máy chủ của tôi Tornado web:Làm thế nào để chia sẻ dữ liệu giữa các yêu cầu trong Tornado Web

Khi POST yêu cầu mục có thể được thực hiện cho các máy chủ, các mục mà sẽ không được tiếp tục tồn vào một tập tin hoặc cơ sở dữ liệu . Khi GET yêu cầu một quá trình có thể được bắt đầu hoặc chấm dứt.

Do đó, tôi cần chia sẻ dữ liệu giữa các yêu cầu khác nhau trong triển khai RequestHandler của mình. Cách bình thường để làm như vậy là gì?

Tôi gặp khó khăn khi lưu dữ liệu vào self, ví dụ: self.entry = "...". Trong một yêu cầu khác, dữ liệu không còn hiện diện nữa.

Giải pháp duy nhất làm việc tôi đã tìm thấy là để lưu trữ trong đối tượng áp dụng:

application = web.Application([ 
      (r'.*', MainHandler, 
      ]) 

def get(self): 
     # ... 
     self.application.entry = "..." 

Đó có phải là cách thích hợp? Ngoài ra những gì về đồng bộ hóa ở đây, tôi có nghĩa là điều này có nghĩa là truy cập vào dữ liệu được chia sẻ.

Trả lời

15

Tôi đề nghị như sau: Thay vì một đối tượng truy cập cơ sở dữ liệu thông qua một đối tượng mà các cửa hàng dữ liệu của bạn, ví dụ:

data = DataStore() 

application = web.Application([ 
     (r'.*', MainHandler, dict(data = data), 
     ]) 

với phương pháp RequestHandler khởi sau.

def initialize(self, data): 
    self.data = data 

Bạn phải tạo đối tượng trước và vượt qua đối tượng đó, nếu không nó sẽ được tạo lại mỗi lần yêu cầu được xử lý.

+2

Tôi không quen với Tornado, nhưng hãy nhớ rằng điều này có thể sẽ không hoạt động nếu bạn sử dụng nhiều quá trình. – monkut

+0

@monkut Có nhiều quy trình cho máy chủ, máy khách, máy khách? –

+2

Tornado là một máy chủ đơn luồng, đơn luồng ... điều này sẽ hoạt động. – oDDsKooL

0

Bạn có thể sử dụng memcached cho mục đích tương tự. Tuy nhiên, bạn sẽ cần phải thiết lập máy chủ memcached.

http://pypi.python.org/pypi/python-memcached/

+2

Đó có phải là một chút quá mức cần thiết không? Tôi chỉ muốn lưu trữ 2 đối tượng cho thời gian của ứng dụng đang chạy. – RevMoon

1

Application là đối tượng quyền cửa hàng (bán) dữ liệu liên tục. Tuy nhiên, như được đề xuất trên anwser khác, bạn nên xem xét sử dụng một số loại cơ sở dữ liệu để lưu trữ dữ liệu này.

Tuy nhiên, bạn nên lưu ý rằng một phiên (hoặc giao dịch) không hoàn thành đúng (ví dụ bạn nhận được POST nhưng không GET để kích hoạt hành động), bạn nên xóa dữ liệu phiên để không có bộ nhớ rò rỉ máy chủ web.

Từ kinh nghiệm của mình, tôi khuyên bạn nên sử dụng Redis vì nó dễ sử dụng và hỗ trợ key expiration, một cơ chế hữu ích khi bạn cần quản lý dữ liệu phiên.

+0

Tại sao tôi nên sử dụng cơ sở dữ liệu để lưu trữ dữ liệu mà tôi không muốn tồn tại?Dữ liệu chỉ nên có sẵn trong thời gian của máy chủ web đang chạy. Nếu máy chủ web bị lỗi, dữ liệu sẽ bị vô hiệu. Nếu máy chủ web phải được khởi động lại có, dữ liệu sẽ bị vô hiệu. – RevMoon

+0

Tôi nghe bạn. Ứng dụng chắc chắn là con đường để đi trong trường hợp này. Bạn có thể lưu trữ dữ liệu phiên của mình trong bất kỳ vùng chứa nào bạn thích trong cá thể Ứng dụng. Nhận xét của tôi chỉ là khi/nếu dự án của bạn phát triển về chức năng, việc lưu trữ dữ liệu phiên trong cửa hàng của bên thứ ba có thể sẽ hữu ích hơn và nhiều hơn nữa. Hãy suy nghĩ về việc giám sát ứng dụng ví dụ: có thể tuyệt vời để truy lục/tính toán số liệu trên dữ liệu phiên trực tiếp từ một cửa hàng (trái ngược với chính máy chủ đó) khi nó đi mà không làm phiền/ảnh hưởng đến hiệu suất máy chủ của bạn. – oDDsKooL

6

Các documentation đưa ra một cách để làm điều này:

class MyHandler(RequestHandler): 
    def initialize(self, database): 
     self.database = database 

    def get(self, username): 
     ... 

mydatabase = dict() 

app = Application([ 
    (r'/user/(.*)', MyHandler, dict(database=mydatabase)), 
    ]) 

Sau đó, bạn có thể tiết kiệm đối tượng của bạn mydatabase vào một tập tin.

Nhưng tôi không chắc đây là cách phù hợp để đạt được những gì bạn muốn về việc đồng bộ hóa giữa các yêu cầu.

+0

Tôi không muốn lưu dữ liệu của mình, tôi chỉ muốn lưu dữ liệu trong thời gian chạy. Không có cơ sở dữ liệu nào được yêu cầu hoặc yêu cầu ở đây. – RevMoon

+0

Cái mà tôi gọi là 'cơ sở dữ liệu' chỉ là dữ liệu của bạn, bạn có thể sử dụng bất kỳ loại lưu trữ dữ liệu nào. Nó cho phép lưu nó trong thời gian chạy. – pintoch

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