2009-12-16 42 views
0

我有一個Python CGI腳本,它從GPS服務中提取數據;我希望大約每10秒更新一次該信息(GPS服務的TOS允許的最大值)。但是,可能有100個用戶同時查看網頁,都會調用腳本。使用Python CGI限制對外部數據庫的調用

我認爲用戶的腳本需要從緩衝頁面抓取數據,緩衝頁面本身每10秒鐘只能增加一次。如果沒有人直接查看內容(而不是訪問CGI),如何使這個緩衝頁面自動更新?有更好的方法來完成這個嗎?

回答

1

將文件或數據庫(sqlite)中的GPS數據查詢結果與日期時間一起緩存。

然後,您可以對上次緩存的日期時間進行日期時間檢查以啓動另一個GPS數據查詢。

您可能會遇到與CGI雖然日期時間檢查併發問題...

爲了解決併發問題,你可以使用SQLite,和/把寫在一個try除。 這是一個使用sqlite的示例緩存實現。

import datetime 
import sqlite3 

class GpsCache(object): 
    db_path = 'gps_cache.db' 
    def __init__(self): 
     self.con = sqlite3.connect(self.db_path) 
     self.cur = self.con.cursor() 

    def _get_period(self, dt=None): 
     '''normalize time to 15 minute periods''' 
     if dt.minute < 15: 
      minute_period = 0 
     elif 15 <= dt.minute < 30: 
      minute_period = 15 
     elif 30 <= dt_minute < 45: 
      minute_period = 30 
     elif 45 <= dt_minute: 
      minute_period = 25 
     period_dt = datetime.datetime(year=dt.year, month=dt.month, day=dt.day, hour=dt.hour, minute=minute_period) 
     return period_dt 

    def get_cache(dt=None): 
     period_dt = self._get_period(dt) 
     select_sql = 'SELECT * FROM GPS_CACHE WHERE date_time = "%s";' % period_dt.strftime('%Y-%m-%d %H:%M') 
     self.cur.execut(select_sql) 
     result = self.cur.fetchone()[0] 
     return result 


    def put_cache(dt=None, data=None): 
     period_dt = self._get_period(dt) 
     insert_sql = 'INSERT ....' # edit to your table structure 
     try: 
      self.cur.execute(insert_sql) 
      self.con.commit() 
     except sqlite3.OperationalError: 
      # assume db is being updated by another process with the current resutls and ignore 
      pass 

所以我們現在有緩存工具的實現端。

您將首先檢查緩存,如果它不是'新鮮'(doens't返回任何東西),請使用您當前的方法抓取數據。然後緩存您抓取的數據。 你應該更好地組織這一點,但你應該在這裏得到一個總體思路。

使用此示例,您只需使用'get_gps_data'將當前調用替換爲'remote_get_gps_data'即可。

from gps_cacher import GpsCache 

def remote_get_gps_data(): 
    # your function here 
    return data 

def get_gps_data(): 
    data = None 
    gps_cache = GpsCache() 
    current_dt = datetime.datetime.now() 
    cached_data = gps_cache.get_cache(current_dt)  
    if cached_data: 
     data = cached_data 
    else: 
     data = remote_get_gps_data() 
     gps_cache.put_cache(current_dt, data) 
    return data 
+0

併發問題,因爲讀/寫鎖定的文件?另一個想法是什麼 - 每當數據發生變化時,讓本地機器抓取GPS數據和FTP一個新的參考文件。似乎效率低下,但會更好嗎? – Matt 2009-12-16 19:55:40

+0

monkut,謝謝,我最終做了類似於你的建議的事情。代碼在這裏:http://www.instructables.com/id/Bus-tracking-on-the-cheap/step5/Interpret-and-display-your-data/目前不使用SQL,但我可能會稍後嘗試。再次感謝。 – Matt 2009-12-26 03:12:58