Fixed long time issues

A failed attempt to reload gunicorn on html change (so now it's just a draft)
Fixed incompatibility with reload = False
Now we catch the lock getting error instead of just raising it!
This commit is contained in:
Oracle 2025-08-17 02:59:38 +02:00
parent 9ee0798006
commit 386fc21f29
3 changed files with 33 additions and 10 deletions

View File

@ -3,6 +3,7 @@ from django.conf import settings
from django.apps import apps from django.apps import apps
import os, pathlib, importlib, types import os, pathlib, importlib, types
import re
import tomllib import tomllib
class AsyncronConfig(AppConfig): class AsyncronConfig(AppConfig):
@ -19,6 +20,8 @@ class AsyncronConfig(AppConfig):
#if settings.DEBUG: #if settings.DEBUG:
# os.environ['PYTHONASYNCIODEBUG'] = "1" # os.environ['PYTHONASYNCIODEBUG'] = "1"
#self.watch_templates_for_reload() Does not Work Rn.
self.load_model_auxilaries() self.load_model_auxilaries()
self.load_extensions() self.load_extensions()
@ -41,6 +44,23 @@ class AsyncronConfig(AppConfig):
loader = importlib.machinery.SourceFileLoader( f"{app.name}.{name}", str(import_file) ) loader = importlib.machinery.SourceFileLoader( f"{app.name}.{name}", str(import_file) )
loader.exec_module( types.ModuleType(loader.name) ) loader.exec_module( types.ModuleType(loader.name) )
def watch_templates_for_reload( self ):
from .gunicorn import post_fork
if not hasattr(post_fork, 'worker'): return
if not post_fork.worker.reloader: return
if not any( tconf.get('APP_DIRS', False) for tconf in settings.TEMPLATES ): return
for app in apps.get_app_configs():
app_templates_dir = pathlib.Path(app.path) / "templates"
if not app_templates_dir.exists(): continue
for dirpath, dirnames, filenames in app_templates_dir.walk():
print("D:", dirpath, dirnames, filenames )
post_fork.worker.reloader.add_extra_file( dirpath )
def load_model_auxilaries( self ): def load_model_auxilaries( self ):
""" """
Loads auxilary (passive) data from the models.toml file of each app. Loads auxilary (passive) data from the models.toml file of each app.

View File

@ -20,11 +20,12 @@ def post_fork( server, worker ): #worker and AsyncronWorker, pay attention!
AsyncronWorker.MAX_COUNT = 1 AsyncronWorker.MAX_COUNT = 1
AsyncronWorker.override_exit_signals() AsyncronWorker.override_exit_signals()
to_override = worker.reloader._callback if worker.reloader: #So if reload = True
def new_callback(*args, **kwargs): to_override = worker.reloader._callback
AsyncronWorker.stop( reason = "Auto Reload" ) def new_callback(*args, **kwargs):
return to_override(*args, **kwargs) AsyncronWorker.stop( reason = "Auto Reload" )
worker.reloader._callback = new_callback return to_override(*args, **kwargs)
worker.reloader._callback = new_callback
return init_to_override( *args, **kwargs ) return init_to_override( *args, **kwargs )
AsyncronWorker.init = init AsyncronWorker.init = init

View File

@ -357,10 +357,12 @@ class AsyncronWorker:
async for task in Ts: async for task in Ts:
locked = await Task.objects.filter( id = task.id ).filter( try:
models.Q(worker_lock = None) | locked = await Task.objects.filter( id = task.id ).filter(
models.Q(worker_lock = self.model) #This is incase the lock has been aquired for some reason before. models.Q(worker_lock = None) |
).aupdate( worker_lock = self.model ) models.Q(worker_lock = self.model) #This is incase the lock has been aquired for some reason before.
).aupdate( worker_lock = self.model )
except IntegrityError: continue
if not locked: continue if not locked: continue
trace = task.new_trace() trace = task.new_trace()