2013-03-25 4 views
0

Я должен перезагрузить свой ключ (что-то вроде сеансового ключа) каждые два часа, что и истечет после этого. который является наилучшим способом реализации функции реактивации в моем коде?Лучший способ сбросить ключи, срок действия которых истекает через несколько минут в python

Для меня нет способа проверить, действительно ли мой ключ действует, кроме проверки состояния, выполняя некоторые действия, требующие действительных ключей.

Я ищу решение, с помощью которого я могу использовать его для гибкого времени истечения (которое передается как параметр) для моего ключа.

+0

Почему мы голосуем, чтобы закрыть это? – Nix

+0

вам нужно будет предоставить гораздо больше информации, чтобы получить полезный ответ. – MattDMo

+0

* Этот вопрос неоднозначен, расплывчатый, неполный, слишком широкий или риторический и не может быть обоснованно ответил в его текущей форме. * – MattH

ответ

1

В общих чертах:

  1. Создать класс объекта для представления каждого ключа;
  2. Имейте в качестве элемента каждого экземпляра этого объекта его приуроченную жизнь;
  3. имеют обратный вызов для вызова экземпляра в соответствующее время;
  4. объект решает умереть или повторно вверх на тайм-аут

Вот тривиальный пример:

import threading, time, random 

class Key(object): 
    results={} 
    def __init__(self,refresh,name): 
     self.refresh=refresh 
     self.name=name 
     self.t0=time.time() 
     self.t=threading.Timer(refresh,self.now_what) 
     self.t.start() 

    def now_what(self): 
     s='{}: {:6.4f}'.format(self.name,time.time()-self.t0) 
     Key.results.setdefault(self.refresh,[]).append(s) 
     # do the thing you want at this time ref with the Key... 

    def time_left(self): 
     return max(self.t0+self.refresh-time.time(),0) 

keys=[Key(random.randint(2,15),'Key {}'.format(i)) for i in range(1,1001)] 
t=time.time() 
while any(key.time_left() for key in keys): 
    if time.time()-t > 1: 
     kc=filter(lambda x: x, (key.time_left() for key in keys)) 
     if kc: 
      tmpl='{} keys; max life: {:.2f}; average life: {:.2f}' 
      print tmpl.format(len(kc),max(kc),sum(kc)/len(kc)) 
      t=time.time() 

for k in sorted(Key.results): 
    print '\nKeys with {} secs life:'.format(k) 
    for e in Key.results[k]: 
     print '\t{}'.format(e) 

Печать:

1000 keys; max life: 13.98; average life: 7.38 
933 keys; max life: 12.98; average life: 6.85 
870 keys; max life: 11.97; average life: 6.29 
796 keys; max life: 10.97; average life: 5.80 
729 keys; max life: 9.97; average life: 5.26 
666 keys; max life: 8.96; average life: 4.68 
594 keys; max life: 7.96; average life: 4.16 
504 keys; max life: 6.96; average life: 3.77 
427 keys; max life: 5.96; average life: 3.32 
367 keys; max life: 4.95; average life: 2.74 
304 keys; max life: 3.95; average life: 2.16 
215 keys; max life: 2.95; average life: 1.76 
138 keys; max life: 1.95; average life: 1.32 
84 keys; max life: 0.95; average life: 0.72 

Keys with 2 secs life: 
    Key 26: 2.0052 
    Key 27: 2.0053 
    Key 41: 2.0048 
    ... 
Keys with 3 secs life: 
    Key 4: 3.0040 
    Key 31: 3.0065 
    Key 32: 3.0111 
    ... 
Keys with 4 secs life: 
... 

Вы можете видеть, что есть это некоторая изменчивость в точности, но для большинства целей она составляет 1/100 сек.

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