Jestem po wątku bezpieczne kontener Python, w którym wartości są automatycznie usuwane po pewnym czasie. Czy taka klasa istnieje?Kontener, w którym wartości wygasają w pythonie
Odpowiedz
Tutaj jest wątek bezpieczne wersja 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)
które mogą być używane tak:
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)])
dzięki! Lubię gwintowany limit czasu. Czy mój przykład nie był bezpieczny dla wątków? Dokumenty mówią, że "deque" to alternatywna implementacja nieskoordynowanych kolejek z szybkimi operacjami atomowej append() i popleft(), które nie wymagają blokowania. " – hoju
@ Plumo: Nie jestem ekspertem w ocenie bezpieczeństwa wątków, ale myślę, że Twoja wersja ExpireCounter może nie być bezpieczna dla wątków. W metodzie 'add' nie można natychmiast wywołać' datetime.now() 'wywołaniem' self.events.append'. Wyobraź sobie, że wiele wątków wywołuje metodę 'add' w pobliżu jednocześnie. Partie wywołań do 'datetime.now', ale wyniki zostają dołączone do' self.events' w pomieszanej kolejności. Jeśli 'self.events' nie jest uporządkowany chronologicznie, to pętla while w metodzie' expire' może zakończyć się zbyt wcześnie. W ten sposób może przestać 'popleft' wszystkie elementy, które przekroczyły limit czasu. – unutbu
Być może potrzebujesz pamięci podręcznej LRU. Oto jeden Byłem sens wypróbować:
http://pypi.python.org/pypi/repoze.lru
To wydaje się być bezpieczne dla wątków.
no not LRU. Chcę, aby wartość wygasała po dokładnie określonym czasie, niezależnie od tego, ile mam wartości i czy uzyskuję do nich dostęp. – hoju
W takim przypadku można zapisać czas wygaśnięcia dla każdej wartości. Jaki rodzaj semantyki kontenera chcesz: list, zestaw, dykt, czy coś innego? –
nie dotyczy rodzaju kontenera, o ile jest bezpieczny dla nitek – hoju
To jest mniej więcej to, co chcę teraz:
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. Najszybszy kontener C++: Unikalne wartości
- 2. Jaki kontener przechowywać wartości unikatowe?
- 3. Guava Ticker Cache wygasają
- 4. Kontener kowariancji w C++
- 5. Szyny Token CSRF - czy wygasają?
- 6. jsp kontener kontra kontener serwletu
- 7. Jak wyczyścić kontener sesji w Zend framework2
- 8. Standardowy kontener C++ i kontener STL w C++
- 9. CakePHP: Znajdź pole, w którym nie ma wartości null
- 10. MySQL wartości count wiersza, w którym kolumna = wartość
- 11. Uruchom pełny kontener w Dockerze?
- 12. wartości dołącza do zestawu w Pythonie
- 13. Suma wszystkich wartości licznika w Pythonie
- 14. Zliczanie prawdziwej wartości logiczne w Pythonie listy
- 15. Dwuwymiarowa lista błędnie przypisująca wartości w pythonie
- 16. Wiele poziomów kluczy i wartości w Pythonie
- 17. Dołączanie wartości do słownika w Pythonie
- 18. Policz liczbę klastrów niezerowych wartości w Pythonie?
- 19. Stwórz słownik w Pythonie z wartości wejściowych
- 20. wybranie wartości z pliku JSON w Pythonie
- 21. mysql wartość NULL w którym w punkcie
- 22. Czy wygasają żetony antyfirmatorskie ASP.NET MVC CSRF?
- 23. Android - Czy znaczniki uwierzytelniania użytkownika Firebase wygasają?
- 24. LINQ- Max w którym warunek
- 25. Ignoring -Inf wartości w tablicach używających numpy/scipy w Pythonie
- 26. Jak odjąć jedną z każdej wartości w kodzie w Pythonie?
- 27. Jak znaleźć indeks wartości w tablicy 2d w Pythonie?
- 28. Czy wartość w słowniku w Pythonie może mieć dwie wartości?
- 29. przełączania kluczy i wartości w słowniku w Pythonie
- 30. Jak posortować listę, sprawdzając wartości w podlistrze w pythonie?
możliwy duplikat: http://stackoverflow.com/questions/3927166/automatically-expiring-variable – mouad
Jestem po wątku s klasa afe z limitami czasu dla każdej wartości. W tym przykładzie użyto listy i globalnego limitu czasu. – hoju