什么';在python中,在循环期间暂停的最有效方法是什么?

什么';在python中,在循环期间暂停的最有效方法是什么?,python,loops,Python,Loops,我有一个脚本,它循环遍历列表中的元素。每个元素都用于查询API。但是,API有一个查询限制(24小时内只允许500个查询)。我目前正在通过循环中的一个计数器进行管理,该计数器为500个元素的每个“块”重置,并将循环暂停一天。有更好的方法吗 counter = 0 for query in queries: if counter < 500: counter = counter + 1 api = ApiClient(api_key='secretke

我有一个脚本,它循环遍历列表中的元素。每个元素都用于查询API。但是,API有一个查询限制(24小时内只允许500个查询)。我目前正在通过循环中的一个计数器进行管理,该计数器为500个元素的每个“块”重置,并将循环暂停一天。有更好的方法吗

counter = 0
for query in queries:
    if counter < 500:
        counter = counter + 1
        api = ApiClient(api_key='secretkey')
        data = api.get(q=query)
        print(data)
        safequery = ''.join(e for e in query if e.isalnum())
        datafilename = "{} {}.txt".format(safequery,todaysdate)
        with open(datafilename, 'w') as outfile:
            json.dump(data, outfile)
    else:
        print('sleepy time')
        time.sleep(86400)
        counter = 0
计数器=0
对于查询中的查询:
如果计数器<500:
计数器=计数器+1
api=ApiClient(api_key='secretkey')
data=api.get(q=query)
打印(数据)
safequery=''.join(如果e.isalnum(),则查询中的e代表e)
datafilename=“{}{}.txt”。格式(安全查询,今天)
将open(datafilename,'w')作为输出文件:
json.dump(数据,输出文件)
其他:
打印(“睡眠时间”)
时间。睡眠(86400)
计数器=0
时间。睡眠(86400)是在问问题,也会让你的CPU白白工作。如果在86400秒内发生了什么事情,脚本崩溃,则不会重新启动它

更好的选择是将当前页面/区块保存在某个地方(原始文本文件、json、DB,其实并不重要),然后在发出下一个请求之前加载它


然后,您可以将脚本放入操作系统级/托管任务调度程序中(例如,用于Unix的cron或用于Windows的任务调度程序),并每天运行它。

带有sleep的if-else语句可能非常简单;但是,它没有效率,因为该进程仍将处于活动状态,并且在86400秒内不执行任何操作

您可以考虑创建一个作业,每天同时运行一次代码。sleep()是一个很好的解决方案,但您也可以让Python在需要继续时请求输入。我知道这很原始

如果计数器%500==0:#使计数器从1开始
val=输入(“\n是否继续?[y/n]:”)
如果val==“y”:
通过#随时手动解除循环暂停
elif val=='n':
中断#循环中断

我将通过创建一个脚本来解决这个问题,该脚本在运行时将获得下一个500,然后终止。您可能希望输出一个文本文件,以存储在此序列中所处的位置

然后,我将使用windows任务计划程序(在windows上)计划此脚本每24小时运行一次

这意味着您没有让一个进程什么都不做地运行

sleep()

应仅用于小时间间隔

我认为您可以将此代码作为python脚本并在批处理文件中执行

捕获此批处理文件并将其安排到任务管理器中,以便每天下午2:00运行,例如


通常我有一个Python脚本服务器来运行我的机器人和我需要自动完成的事情。

是否有一个很强的理由在整个过程中等待一整天呢?这似乎不是最好的主意,因为这个过程需要等待很长时间。一个选项是确保数据(查询)已分区或可配置为可恢复,然后每天运行一次程序,并在处理完当天的查询后退出。某种调度作业运行方式每天都会触发作业(cron或systemd计时器是基于Linux的系统上常见的解决方案)。@farzad OP需要等待,以便它们不会命中API quotay您的逻辑有点错误-除了触发睡眠之外,还会跳过每一个第500个查询。如果您只希望有条件地执行睡眠(和计数器重置),那么实际的查询应该是无条件的。但是,如何在最后一次查询的列表中捕获“where”呢。我需要它从列表中最后一个元素之后恢复查询?@OwaisArshad如我所写,只需存储在a file/DB中,并在下次执行时加载它