Sono in un contenitore Python sicuro da file in cui i valori vengono automaticamente rimossi dopo un certo tempo. Esiste una classe del genere?contenitore in cui i valori scadono in python
risposta
Ecco una versione thread-safe di ExpireCounter:
import datetime
import collections
import threading
class ExpireCounter:
"""Tracks how many events were added in the preceding time period
"""
def __init__(self, timeout=1):
self.lock=threading.Lock()
self.timeout = timeout
self.events = collections.deque()
def add(self,item):
"""Add event time
"""
with self.lock:
self.events.append(item)
threading.Timer(self.timeout,self.expire).start()
def __len__(self):
"""Return number of active events
"""
with self.lock:
return len(self.events)
def expire(self):
"""Remove any expired events
"""
with self.lock:
self.events.popleft()
def __str__(self):
with self.lock:
return str(self.events)
che può essere utilizzato in questo modo:
import time
c = ExpireCounter()
assert(len(c) == 0)
print(c)
# deque([])
c.add(datetime.datetime.now())
time.sleep(0.75)
c.add(datetime.datetime.now())
assert(len(c) == 2)
print(c)
# deque([datetime.datetime(2010, 11, 19, 8, 50, 0, 91426), datetime.datetime(2010, 11, 19, 8, 50, 0, 842715)])
time.sleep(0.75)
assert(len(c) == 1)
print(c)
# deque([datetime.datetime(2010, 11, 19, 8, 50, 0, 842715)])
grazie! Mi piace il timeout del thread. Il mio esempio non è sicuro? I documenti dicono "deque è un'implementazione alternativa di code illimitate con operazioni atomic append() e popleft() che non richiedono il locking." – hoju
@Plumo: Non sono esperto nel giudicare la sicurezza dei thread, ma penso che la tua versione di ExpireCounter potrebbe non essere thread-safe. Nel metodo 'add', la chiamata a' datetime.now() 'potrebbe non essere seguita immediatamente dalla chiamata a' self.events.append'. Immagina più thread che chiamano il metodo 'add' quasi simultaneamente. Un sacco di chiamate a 'datetime.now', ma i risultati vengono aggiunti a' self.events' in un ordine confuso. Se 'self.events' non è ordinato cronologicamente, allora il ciclo while nel metodo' expire' potrebbe finire troppo presto. Pertanto, potrebbe non riuscire a "popleft" tutti gli elementi che sono scaduti. – unutbu
Forse si desidera una cache LRU. Ecco quello che ho in mente di provare:
http://pypi.python.org/pypi/repoze.lru
Sembra essere thread-safe.
no not LRU. Voglio che un valore scada dopo esattamente il timeout specificato, indipendentemente da quanti valori ho e se li accedo. – hoju
In tal caso, è possibile memorizzare una data di scadenza con ciascun valore. Che tipo di semantica del contenitore vuoi: lista, set, dict o qualcos'altro? –
non riguarda il tipo di contenitore purché thread safe – hoju
Questo è più o meno quello che voglio per ora:
from datetime import datetime, timedelta
from collections import deque
class ExpireCounter:
"""Tracks how many events were added in the preceding time period
"""
def __init__(self, timeout=timedelta(seconds=1)):
self.timeout = timeout
self.events = deque()
def add(self):
"""Add event time
"""
self.events.append(datetime.now())
def __len__(self):
"""Return number of active events
"""
self.expire()
return len(self.events)
def expire(self):
"""Remove any expired events
"""
now = datetime.now()
try:
while self.events[0] + self.timeout < now:
self.events.popleft()
except IndexError:
pass # no more events
if __name__ == '__main__':
import time
c = ExpireCounter()
assert(len(c) == 0)
c.inc()
time.sleep(0.75)
c.inc()
assert(len(c) == 2)
time.sleep(0.75)
assert(len(c) == 1)
- 1. selezionare i valori da una tabella in cui i valori di esclusione in un'altra tabella
- 2. SQL e Null I valori in cui la clausola
- 3. Memcache + PHP - Perché i dati non scadono?
- 4. Come collegare punti in cui mancano valori?
- 5. Python: Rileva i codec utilizzati in un contenitore video
- 6. Come convertire i valori del dizionario in int in Python?
- 7. Le sessioni Tomcat scadono in modo imprevisto
- 8. assegnare i valori ai simboli in python debugger (pdb)
- 9. Come si concentra allineare i div fluttanti in cui il contenitore genitore non ha una larghezza?
- 10. Selezionare i 3 dischi più recenti in cui i valori di una colonna sono distinte
- 11. Come riattivare i documenti i cui valori terminano con un particolare caharacter in mongoDB
- 12. Un contenitore std :: map che mappa i tipi ai valori
- 13. Rails Token CSRF - Scadono?
- 14. Sostituire i valori nell'elenco usando Python
- 15. Guava Ticker cache scadono
- 16. Come aumentare i valori in una mappa
- 17. Sessioni PHP che scadono inaspettatamente
- 18. Python - Come modificare i valori in un elenco di elenchi?
- 19. Dividere i valori di due dizionari in python
- 20. Sfogliando i valori booleani in una lista Python
- 21. È prassi comune testare i valori dei tipi in Python?
- 22. Somma tutti i valori di un contatore in Python
- 23. modifica i valori rgb in un jpg con python
- 24. Come gestire i valori temporali su 24 ore in python?
- 25. HashMap non fornisce valori nell'ordine in cui li ha aggiunti
- 26. voci del dizionario Memorizzazione Python nell'ordine in cui sono spinti
- 27. Le sessioni PHP scadono presto
- 28. Contenitore C++ più veloce: valori unici
- 29. python -> tempo in cui il ciclo è in esecuzione
- 30. Tra cui valori hash in ASP.NET MVC percorsi URL
possibile duplicato: http://stackoverflow.com/questions/3927166/automatically-expiring-variable – mouad
I am after a thread s classe sicura con timeout per ogni valore. Questo esempio utilizza un elenco e un timeout globale. – hoju