我对time.sleep
循环中的if/else
命令有疑问。我用纬度和经度对不同的地方提出api请求。总而言之,我需要5年的请求。我在纬度和经度以及要求的五年内使用了两个for
循环。问题是我每分钟只能发送6个请求。因此,我使用time.sleep
命令如下:
for lat, lon in zip(lats, lons):
for year in years:
args = {
'interpolate': False,
'lat': lat,
'lon': lon,
'date_from': year + '-01-01',
'date_to': year + '-12-31',
'capacity': 500,
'height': 44,
'turbine': 'Enercon E40 500',
'format': 'json',
'metadata': False,
'raw': True,
}
r = s.get(url, params=args)
data = pd.read_json(r.text, orient='index')
df = df.append(data)
time.sleep(61)
该功能运行良好,time.sleep
命令也是如此!但是在这种形式下,该函数在最后一次传递后等待61秒。我想让它变得更轻松,更顺畅"以这种方式使用if/else
循环,如果循环使用最后一个纬度/经度,则可以忽略time.sleep
命令。这些年份是正常列表,纬度/经度位于单独的Excel表格中。有人有想法,我怎么写这个?我尝试过的方式并不起作用,我需要一些新的灵感......谢谢!
答案 0 :(得分:1)
每分钟6次请求与每个内部循环的5次请求不匹配,因此您需要将睡眠与循环分离。当你发现自己处于迭代结束并且没有充分理由睡觉时,你不需要无偿的睡眠。并且您不需要硬编码的睡眠时间,因为这不会占用您处理的时间。
解决方案是编写一个跟踪时间限制的类。它可以记住时间,每六次调用一次,等待60秒到任何时间已经过去的增量时间。
将起搏器放在内循环的开头,当你已经知道还有另外一个请求未决时,它会每6个请求休眠一次。
class Pacer:
def __init__(self, burst_size, seconds):
self.tick = time.time()
self.burst_size = burst_size
self.seconds = seconds
self.count = 1
def step(self):
if self.count % self.seconds == 0:
delta = self.seconds - (time.time() - self.tick)
if delta > 0:
time.sleep(delta)
self.tick = time.time()
self.count += 1
pacer = Pacer(6, 60)
for lat, lon in zip(lats, lons):
for year in years:
pacer.step()
args = {
'interpolate': False,
'lat': lat,
'lon': lon,
'date_from': year + '-01-01',
'date_to': year + '-12-31',
'capacity': 500,
'height': 44,
'turbine': 'Enercon E40 500',
'format': 'json',
'metadata': False,
'raw': True,
}
r = s.get(url, params=args)
data = pd.read_json(r.text, orient='index')
df = df.append(data)