#34276: LocMemCache not working for multiple threads
-----------------------------------------+-----------------------------
               Reporter:  dhiegomaga     |          Owner:  nobody
                   Type:  Bug            |         Status:  new
              Component:  Uncategorized  |        Version:  4.1
               Severity:  Normal         |       Keywords:  LocMemCache
           Triage Stage:  Unreviewed     |      Has patch:  0
    Needs documentation:  0              |    Needs tests:  0
Patch needs improvement:  0              |  Easy pickings:  0
                  UI/UX:  0              |
-----------------------------------------+-----------------------------
 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=UdpReceiver.receiverLoop,
 args=(self,))
     self.t.daemon = True
     self.count = 1

   def receiverLoop(self):
     global udpTempVar
     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.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34276>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070185d0036833-6cf92f26-8e44-47c2-a05b-afe120532ff9-000000%40eu-central-1.amazonses.com.

Reply via email to