带有if / else条件的循环中的Python time.sleep命令

时间:2018-05-06 18:41:17

标签: python loops if-statement

我对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表格中。有人有想法,我怎么写这个?我尝试过的方式并不起作用,我需要一些新的灵感......谢谢!

1 个答案:

答案 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)