我有一個Python CGI腳本,它從GPS服務中提取數據;我希望大約每10秒更新一次該信息(GPS服務的TOS允許的最大值)。但是,可能有100個用戶同時查看網頁,都會調用腳本。使用Python CGI限制對外部數據庫的調用
我認爲用戶的腳本需要從緩衝頁面抓取數據,緩衝頁面本身每10秒鐘只能增加一次。如果沒有人直接查看內容(而不是訪問CGI),如何使這個緩衝頁面自動更新?有更好的方法來完成這個嗎?
我有一個Python CGI腳本,它從GPS服務中提取數據;我希望大約每10秒更新一次該信息(GPS服務的TOS允許的最大值)。但是,可能有100個用戶同時查看網頁,都會調用腳本。使用Python CGI限制對外部數據庫的調用
我認爲用戶的腳本需要從緩衝頁面抓取數據,緩衝頁面本身每10秒鐘只能增加一次。如果沒有人直接查看內容(而不是訪問CGI),如何使這個緩衝頁面自動更新?有更好的方法來完成這個嗎?
將文件或數據庫(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
併發問題,因爲讀/寫鎖定的文件?另一個想法是什麼 - 每當數據發生變化時,讓本地機器抓取GPS數據和FTP一個新的參考文件。似乎效率低下,但會更好嗎? – Matt 2009-12-16 19:55:40
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