Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python限制每8小时的查询数_Python_Time - Fatal编程技术网

python限制每8小时的查询数

python限制每8小时的查询数,python,time,Python,Time,可能有人已经解决了这个问题。我需要一个基于Python的UDP接口,用于返回DB查询的结果。DB仅限于每8小时提供500个查询。这是我的逻辑,它似乎起了某种作用 但我确实有一个8小时的移动窗口,这意味着我可以在几秒钟内查询数据库。基本上,我是对的。有谁有一个聪明的可重用代码我可以用来做这个 #!/usr/bin/env python import SocketServer import sys,os,httplib,urllib,multiprocessing,time import syslo

可能有人已经解决了这个问题。我需要一个基于Python的UDP接口,用于返回DB查询的结果。DB仅限于每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
#/usr/bin/env python
导入SocketServer
导入系统、操作系统、httplib、urllib、多处理、时间
导入系统日志
将sqlite3导入为lite
syslog.openlog(sys.argv[0],syslog.LOG\u-PID,syslog.LOG\u-USER)
计数d=0
stime=int(time.time())
def操作流程(vars):
全局计数,计时
dtime=int(time.time())-stime
score=“未知”
如果计数>500:
如果dtime<28800:
syslog.syslog(“超过q限制”+str(dtime)+“,“+str(计数))
返回“未知”
否则:#重置时钟
stime=time.time()
计数d=0
data=dbh.do(“选择…”)#一些数据库查询
如果是数据!=无:
计数d=计数d+1
返回数据
谢谢
Vijay

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

def操作过程(vars):
全局qlist
now=int(time.time())
#删除早于8小时的查询
而qlist:
如果现在-qlist[0]>28800:
del qlist[0]
其他:
打破
如果len(qlist)<500:
#你可以走了
#提交查询,然后将时间附加到qlist
data=dbh.do(“选择…”)#一些数据库查询
追加(int(time.time()))

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

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")
导入时间
查询=[]
间隔=8*24*60
最大查询数=500
def do_query():
全局查询
now=time.time()
#过滤查询时间戳
查询=过滤器(lambda x:now-x<间隔,查询)
如果len(查询)
您为什么需要进行计数?有限制的东西不算吗?只需捕获失败查询的异常。此解决方案类似于Fraggy的解决方案,可以正常工作-我唯一关心的是在内存中保留一个大型qlist/查询。在某种程度上,我所关心的只是柜台/8小时。我考虑只使用一个计数器和一个开始时间变量作为全局变量。检查计数器是否28800时,将开始时间重置为当前时间,并将计数器重置为0。有意义吗?500整数不会消耗大量内存。您只是保存时间戳,而不是查询本身。
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")