-1

有人可能已经解决了这个问题。我需要一个基于 Python 的 UDP 接口,它从数据库查询返回结果。数据库仅限于每 8 小时提供 500 个查询。这是我的逻辑,它似乎有点工作。

但我确实有一个 8 小时的移动窗口,这意味着我可以在几秒钟内很快查询数据库。我基本上是正确的。任何人都有一个聪明的可重用代码,我可以使用它吗?

#!/usr/bin/env python
import SocketServer
import sys,os,httplib,urllib,multiprocessing,time
import syslog
import sqlite3 as lite
syslog.openlog(sys.argv[0],syslog.LOG_PID,syslog.LOG_USER)
count_d=0
stime=int(time.time())

def oprocess(vars):
    global count_d,stime
    dtime=int(time.time())-stime
    score="Unknown"
    if count_d > 500:
        if dtime < 28800:
            syslog.syslog("Exceeded q limit "+str(dtime)+","+str(count))
            return "Unknown"
        else: # Reset the clock
            stime=time.time()
            count_d=0
    data=dbh.do("SELECT...") # Some DB query
    if data != None:
        count_d=count_d+1
        return data

谢谢维杰

4

2 回答 2

0

您可以在 中保存成功查询时间的全局列表qlist,然后在 oprocess() 中保存:

def oprocess(vars):
    global qlist
    now = int(time.time())
    #remove queries older than 8 hours
    while qlist:
        if now - qlist[0] > 28800:
            del qlist[0]
        else:
            break 
    if len(qlist) < 500:
        #you are good to go
        #submit your query, then append the time to qlist
        data=dbh.do("SELECT...") # Some DB query
        qlist.append(int(time.time()))
于 2013-05-21T19:50:44.633 回答
0

将所有时间戳保存在一个列表中,然后在每个查询上进行过滤。或者依靠上游来阻止你并处理异常

import time

queries = []
INTERVAL = 8*24*60
MAX_QUERIES = 500


def do_query():
    global queries
    now = time.time()
    # filter query timestamps
    queries = filter(lambda x: now-x < INTERVAL, queries)
    if len(queries) < MAX_QUERIES:
        # do query
        queries.append(now)
    else:
        raise Exception("too man queries")
于 2013-05-21T19:58:27.377 回答