Estoy detrás de un contenedor seguro de subprocesos de Python donde los valores se eliminan automáticamente después de un tiempo. ¿Existe tal clase?contenedor donde los valores caducan en python
Respuesta
Aquí es una versión segura del hilo de 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)
que puede ser utilizado como esto:
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)])
gracias! Me gusta el tiempo de espera enhebrado. ¿Mi ejemplo no era seguro para subprocesos? Los documentos dicen "deque es una implementación alternativa de colas ilimitadas con operaciones rápidas atómicas append() y popleft() que no requieren bloqueo". – hoju
@Plumo: no soy un experto en juzgar la seguridad de los subprocesos, pero creo que su versión de ExpireCounter podría no ser segura para subprocesos. En el método 'add', la llamada a' datetime.now() 'puede no ser seguida inmediatamente por la llamada a' self.events.append'. Imagina múltiples hilos llamando al método 'add' casi simultáneamente. Muchas llamadas a 'datetime.now', pero los resultados se anexan a' self.events' en un orden desordenado. Si 'self.events' no está ordenado cronológicamente, entonces el ciclo while en el método' expire' puede terminar demasiado pronto. Por lo tanto, es posible que no se "copie" todos los elementos que se han agotado. – unutbu
Quizás desee un LRU caché. Aquí hay una que he tenido la intención de probar:
http://pypi.python.org/pypi/repoze.lru
Parece ser seguro para subprocesos.
no no LRU. Quiero que caduque un valor después de exactamente el tiempo de espera dado, independientemente de la cantidad de valores que tenga y de si accedo a ellos. – hoju
En ese caso, puede almacenar un tiempo de vencimiento con cada valor. ¿Qué tipo de semántica de contenedores quieres: list, set, dict u otra cosa? –
no se refiere al tipo de contenedor, siempre que sea seguro para hilos – hoju
Esto es más o menos lo que quiero por ahora:
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. Moose: ¿Caducan los resultados en caché de los cálculos cuando cambian los valores de los atributos?
- 2. Marca Android SeekBar donde están los valores
- 3. ¿Los tokens de actualización de Google caducan?
- 4. Cómo modificar los valores clave en std :: mapa del contenedor
- 5. ¿Se eliminan las claves cuando caducan los datos de Memcache?
- 6. Rails CSRF Token's: ¿caducan?
- 7. Sesiones PHP que caducan temprano
- 8. Boost Python: contenedor polimórfico?
- 9. lista de Python de los dictados cómo fusionar la clave: valor donde los valores son los mismos?
- 10. Valores devueltos de la función contenedor STL
- 11. Sesiones PHP que caducan inesperadamente
- 12. mis llaves Redis no caducan
- 13. Contenedor más rápido de C++: valores únicos
- 14. Python: acceso a los valores anidados en los diccionarios
- 15. Crear clase de Python donde los atributos se definen dinámicamente
- 16. donde ansroid.os.SystemProperties almacena sus claves/valores?
- 17. ¿Cómo se alinean los divs flotantes donde el contenedor principal no tiene un ancho?
- 18. Restar los valores en una lista de los valores correspondientes de otra lista - Python
- 19. MySQLdb Python DONDE SQL LIKE
- 20. Las sesiones de Tomcat caducan inesperadamente
- 21. MVC4 Vista parcial no cargar los valores en el modelo de "contenedor" en segundo palo
- 22. Las sesiones de PHP caducan demasiado pronto
- 23. python dictionary coinciden con los valores clave en dos diccionarios
- 24. Divida los valores de dos diccionarios en python
- 25. Python pandas ordenar columna según los valores en una fila
- 26. ¿Cómo carga python todos los valores en sys.path?
- 27. Búsqueda de diccionario anidada en Python con los valores predeterminados
- 28. Acceso a los valores de argumento predeterminados en Python
- 29. Reemplazar valores en la lista usando Python
- 30. Python lambda de unión a los valores locales
posible duplicar: http://stackoverflow.com/questions/3927166/automatically-expiring-variable – mouad
Estoy buscando un hilo s clase afe con tiempos de espera para cada valor. Ese ejemplo usa una lista y un tiempo de espera global. – hoju