使用Python CGI限制对外部数据库的调用

时间:2009-12-16 04:16:55

标签: python sql cgi

我有一个Python CGI脚本,可以从GPS服务中提取数据;我希望这个信息在网页上大约每10秒更新一次(GPS服务的TOS允许的最大值)。但是,可能有100个用户同时查看网页,所有用户都在调用脚本。

我认为用户的脚本需要从缓冲页面中获取数据,缓冲页面本身仅每十秒更新一次。如果没有人直接查看内容(而不是访问CGI),如何使此缓冲页面自动更新?有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

将GPS数据查询的结果与日期时间一起缓存在文件或数据库(sqlite)中。

然后,您可以针对上次缓存的日期时间执行日期时间检查,以启动另一个GPS数据查询。

你可能会遇到cgi的并发问题和日期时间检查......

要解决并发问题,可以使用sqlite,并将write写入try / except。 这是使用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

因此我们现在将缓存工具作为实现方。

你首先要检查缓存,如果它不是'新鲜'(不要返回任何东西),请使用当前方法获取数据。然后缓存您抓取的数据。 你可能应该更好地组织这个,但你应该在这里得到一般的想法。

使用此示例,您只需将当前对'remote_get_gps_data'的调用替换为'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