全局变量在Pyramid中的所有请求中共享

时间:2015-06-12 11:06:20

标签: python pyramid pylons

我在Pylons中有这个代码,用于计算运行webapp的Linux系统的网络使用情况。基本上,为了计算网络利用率,我们需要读取文件/proc/net/dev两次,这会给我们传输的数据量,并将减去的值除以两次读取之间经过的时间。

我不想定期进行此计算。有一个JS代码定期提取这些数据。传输速率是每个时间单位的两个请求之间的平均传输字节数。在Pylons中,我使用pylons.app_globals来存储读数,该读数将在后续请求中从下一个读数中减去。但显然金字塔中没有app_globals,我不确定使用线程本地是否是正确的行动方案。此外,虽然request.registry.settings显然是在所有请求中共享的,但我不愿意将数据存储在那里,顾名思义它应该只存储设置。

def netUsage():
    netusage = {'rx':0, 'tx':0, 'time': time.time()}
    rtn = {}
    net_file = open('/proc/net/dev')
    for line in net_file.readlines()[2:]:
        tmp = map(string.atof, re.compile('\d+').findall(line[line.find(':'):]))
        if line[:line.find(':')].strip() == "lo":
            continue
        netusage['rx'] += tmp[0]
        netusage['tx'] += tmp[8]
    net_file.close()
    rx = netusage['rx'] - app_globals.prevNetusage['rx'] if app_globals.prevNetusage['rx'] else 0
    tx = netusage['tx'] - app_globals.prevNetusage['tx'] if app_globals.prevNetusage'tx'] else 0
    elapsed = netusage['time'] - app_globals.prevNetusage['time']
    rtn['rx'] = humanReadable(rx / elapsed)
    rtn['tx'] = humanReadable(tx / elapsed)

    app_globals.prevNetusage = netusage
    return rtn

@memorize(duration = 3)
def getSysStat():
    memTotal, memUsed = getMemUsage()
    net = netUsage()
    loadavg = getLoadAverage()
    return {'cpu': getCPUUsage(),
            'mem': int((memUsed / memTotal) * 100),
            'load1': loadavg[0],
            'load5': loadavg[1],
            'load15': loadavg[2],
            'procNum': loadavg[3],
            'lastProc': loadavg[4],
            'rx': net['rx'],
            'tx': net['tx']
            }

1 个答案:

答案 0 :(得分:2)

使用请求线程本地被认为是糟糕的设计,不应该根据官方pyramid docs被滥用。

我的建议是尽可能使用一些简单的键值存储,例如memcachedredis