Opened 22 months ago
Last modified 22 months ago
#34276 closed Bug
LocMemCache not working for multiple threads — at Version 2
Reported by: | D Bersan | Owned by: | nobody |
---|---|---|---|
Component: | Core (Cache system) | Version: | 4.1 |
Severity: | Normal | Keywords: | LocMemCache |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
I have a thread that is initialized on apps.py in a given app in django.
This thread updates the value of a counter
that is saved in cache, using django.core.cache
.
Also I have a view that returns the value of the same cache, in an endpoint:
# jobs.py import threading import time from django.core.cache import cache class MyThread: def __init__(self) -> None: self.t = threading.Thread(target=MyThread.myLoop, args=(self,)) self.t.daemon = True self.count = 1 def myLoop(self): while self.running: time.sleep(3) self.count += 1 cache.set('count', self.count) def start(self): self.running = True self.t.start() def stop(self): self.running = False # -------------- # apps.py from django.apps import AppConfig import os class MyAppConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" name = "MyApp" def ready(self) -> None: from .jobs import MyThread t= MyThread() if os.environ.get('RUN_MAIN', None) != 'true': t.start() # return super().ready() # -------------- # views.py from django.http import JsonResponse from django.core.cache import cache # ... other imports def getCurrentCount(request): global cache if request.method == 'GET': return JsonResponse({ 'count': cache.get('count') })
I am using (LocMemCache)https://docs.djangoproject.com/en/4.1/topics/cache/#local-memory-caching in settings.py:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', } }
But when I try to log the result of cache.get('count')
, it returns None
.
The documentation clearly states:
"This cache is per-process (see below) and thread-safe."
"Note that each process will have its own private cache instance, which means no cross-process caching is possible. "
I have the impression that they meant the cache is per-thread , not per-process . Both my threads are on the same process, so they should share the same caching, according to the documentation. It also emphasizes, no cross-process caching is possible. It doesn't say no cross-threading caching is possible. But reading other resources I found online, it seems this is not shared even among threads, so the documentation is wrong, or there is a bug in this version of Django.
Change History (2)
comment:1 by , 22 months ago
Description: | modified (diff) |
---|
comment:2 by , 22 months ago
Description: | modified (diff) |
---|