gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:56 25 4
gpt4 key购买 nike

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

我不想定期进行此计算。有一个 JS 代码会定期获取这些数据。传输速率是每个时间单位两个请求之间传输的平均字节数。在 Pylons 中,我使用 pylons.app_globals 来存储将在后续请求时从下一个读数中减去的读数。但显然 Pyramid 中没有 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']
}

最佳答案

根据官方 pyramid docs,使用请求线程局部变量被认为是糟糕的设计,不应被滥用.

我的建议是使用一些简单的键值存储,比如 memcachedredis如果可能的话。

关于python - Pyramid 中所有请求共享的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30801544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com