У меня есть этот код в Pylons, который вычисляет сетевое использование системы Linux, на которой работает webapp. В принципе, для расчета использования сети нам нужно дважды прочитать файл /proc/net/dev
, который дает нам количество передаваемых данных и делит вычитаемые значения на время, прошедшее между двумя чтениями.Глобальные переменные, общие для всех запросов в Pyramid
Я не хочу делать это вычисление через регулярные промежутки времени. Есть 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']
}
Этот вопрос также зависит от типа используемого веб-сервера. Проблема в том, что вы можете не знать, сколько процессов или потоков ваши веб-серверы появляются для Python. Таким образом, если у вас есть два или более процессов, они больше не могут делиться глобальными. –
@MikkoOhtamaa, я знаю, но это не похоже на то, что я храню пул соединений с БД. Я не думаю, что безопасность нитей является проблемой для моего случая использования, не так ли? –
Я предполагаю, что для вас работают обычные глобальные Python. Просто поместите свою функцию в какой-то модуль и импортируйте туда. Если ваш процесс Python не перезапускается, запоминание должно работать между запросами. –