2015-06-12 1 views
2

У меня есть этот код в 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'] 
      } 
+0

Этот вопрос также зависит от типа используемого веб-сервера. Проблема в том, что вы можете не знать, сколько процессов или потоков ваши веб-серверы появляются для Python. Таким образом, если у вас есть два или более процессов, они больше не могут делиться глобальными. –

+0

@MikkoOhtamaa, я знаю, но это не похоже на то, что я храню пул соединений с БД. Я не думаю, что безопасность нитей является проблемой для моего случая использования, не так ли? –

+0

Я предполагаю, что для вас работают обычные глобальные Python. Просто поместите свою функцию в какой-то модуль и импортируйте туда. Если ваш процесс Python не перезапускается, запоминание должно работать между запросами. –

ответ

2

Использование запроса Thread местных жителей считается плохой дизайн и не следует злоупотреблять в соответствии с официальным pyramid docs.

Мой совет - использовать некоторое простое хранилище с ключом, например memcached или redis, если это возможно.

+0

Хм. Похоже, перебор. Я больше сторонник внутреннего решения. –

Смежные вопросы