安排定期上传,良好的做法?

时间:2013-02-24 18:28:07

标签: python

我正在使用3g网络从我的raspberrypi向托管的php + mysql数据库发送一堆传感器读数。

为了节省带宽和能量,它was recommended而不是每秒上传传感器读数,我应该只定期上传,即每5分钟上传一次。所以我决定使用JSON格式收集读数以简化上传POST过程:

>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}

我还使用timer2模块设置了一个计时器:

>>> timer2.apply_interval(msecs, fun, args, kwargs, priority=0)

现在每5 * 3600 * 1000就会调用一次。有趣的是,我上传了有效负载并重置了下一轮数据收集的有效负载内容:

>>> r = requests.post(url, data=json.dumps(payload))

问题:

  • 在从主线程收集数据时,从fun开始重置变量有效负载的内容是不错的做法?

  • 有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您应该组织程序来模拟从传感器到数据库的数据流。因此,您将拥有一个以轮询速率调用采样方法的计时器。将采样方法的结果传递给缓冲方法。填充缓冲区,直到缓冲期结束。最后,每当它填满时发布缓冲区。

import random
import time

def generate_samples():
    while True:
        input('Press ENTER to simulate next sample...')
        yield random.random()

def period_elapsed(period_start, period_duration):
    return period_start + period_duration < time.time()

def collect_buffers(samples, buffer_period):
    buffer_time = time.time()
    buffer_samples = []
    for sample in samples:
        buffer_samples.append(sample)
        if period_elapsed(buffer_time, buffer_period):
            yield buffer_samples
            buffer_samples = []
            buffer_time = time.time()

def post_buffers(buffers, url):
    for b in buffers:
        requests.post(url, data=json.dumps(buffer))

post_buffers(collect_buffers(generate_samples(), 300), 'http://localhost:3000')