I would like my cached methods to never return expired values and block wait instead.
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 35/100
Piste de recherche
Commencez par dogpile/cache/region.py aux lignes liées 954-958 et suivez la manière dont une valeur expirée est traitée pendant qu’un autre processus crée un remplacement. Utilisez la reproduction fournie avec multiprocessing pour vérifier le comportement actuel. Le travail est terminé lorsque les appels concurrents attendent la valeur actualisée au lieu de recevoir la valeur expirée, la reproduction montrant que les deux appels renvoient la nouvelle valeur.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Hello,
I have a multiproces/thread scenario where my cached function can be called at the same time.
I end up falling into the scenario of
https://github.com/sqlalchemy/dogpile.cache/blob/de85b101f864bd0f5f3ba97dc96950b94f143d82/dogpile/cache/region.py#L954-L958
So what I have is an expired value in the cache.
Thread 1 retrieves it, notices it's expired, starts creating a new value, and will return the new value.
Meanwhile; Thread 2 retrieves it, notices it's expired, notices thread 1 is busy creating and returns the old value.
But the old value is entirely useless for my case. It's expired for a reason. Is there a way to configure the cache region to never return expired values and just block/wait for creation instead. Just like a cache miss?
(simplified) Code to reproduce my issue:
import os
import time
from multiprocessing import Process
from dogpile.cache import make_region
cache_region = make_region()
cache_region.configure(
"dogpile.cache.dbm",
expiration_time=1,
arguments={
"filename": "/tmp/cache.dbm",
},
)
@cache_region.cache_on_arguments()
def get_value():
print(os.getpid(), "Making new value...")
time.sleep(2)
return f"Got value {time.time():.0f}"
def run():
print(os.getpid(), get_value())
print("3 sync calls in a row (value should be made once):")
run()
run()
run()
processes = []
for i in range(2):
process = Process(target=run)
processes.append(process)
time.sleep(2)
print()
print("2 async calls after cache expired (value should be made once) and be different from the previous:")
for process in processes:
process.start()
for process in processes:
process.join()
Example output:
3 sync calls in a row (value should be made once):
103954 Making new value...
103954 Got value 1740579012
103954 Got value 1740579012
103954 Got value 1740579012
2 async calls after cache expired (value should be made once) and be different from the previous:
103978 Got value 1740579012
103977 Making new value...
103977 Got value 1740579016
In the above output, the line 103978 Got value 1740579012 is bad for me. That should never return an expired value.
- Langage dominant
- Python
- Étoiles
- 301
- Forks
- 51
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de sqlalchemy/dogpile.cache
-
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
sqlalchemy/dogpile.cache#267 · 3 commentaires ·
-
Difficulté 3/5 1-2 jours Accessibilité débutants 35/100
sqlalchemy/dogpile.cache#265 · 4 commentaires ·
-
Registry of all cached functionsOuverte
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 20/100
sqlalchemy/dogpile.cache#258 · 1 commentaire ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 42/100
sqlalchemy/dogpile.cache#243 · 2 commentaires ·
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 28/100
sqlalchemy/dogpile.cache#242 · 2 commentaires ·
Toutes les issues de sqlalchemy/dogpile.cache
Issues similaires
-
area:core-platform effort:S priority:P3 risk:night-safe status:ready type:test
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
randomparity/kdive#3620 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
FinanceFlash/unvibecode#760 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
google-research/google-research#3470 ·
Les mainteneurs répondent en général sous 21 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
mrvautin/ha-workouts#11 ·