diff --git a/asyncron/apps.py b/asyncron/apps.py index 63ce55e..d7ba166 100644 --- a/asyncron/apps.py +++ b/asyncron/apps.py @@ -3,6 +3,7 @@ from django.conf import settings from django.apps import apps import os, pathlib, importlib, types +import re import tomllib class AsyncronConfig(AppConfig): @@ -19,6 +20,8 @@ class AsyncronConfig(AppConfig): #if settings.DEBUG: # os.environ['PYTHONASYNCIODEBUG'] = "1" + #self.watch_templates_for_reload() Does not Work Rn. + self.load_model_auxilaries() self.load_extensions() @@ -41,11 +44,28 @@ class AsyncronConfig(AppConfig): loader = importlib.machinery.SourceFileLoader( f"{app.name}.{name}", str(import_file) ) 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 ): """ Loads auxilary (passive) data from the models.toml file of each app. Data is either a keyword argument of a field, or an allowed Meta class value. - + There should be no database defining values set the toml file: - ModelName.Meta.verbose_name -> Allowed - ModelName.Meta.unique_together -> Bad Idea / Undefined Behaviour diff --git a/asyncron/gunicorn.py b/asyncron/gunicorn.py index b2ef33f..53221f6 100644 --- a/asyncron/gunicorn.py +++ b/asyncron/gunicorn.py @@ -20,11 +20,12 @@ def post_fork( server, worker ): #worker and AsyncronWorker, pay attention! AsyncronWorker.MAX_COUNT = 1 AsyncronWorker.override_exit_signals() - to_override = worker.reloader._callback - def new_callback(*args, **kwargs): - AsyncronWorker.stop( reason = "Auto Reload" ) - return to_override(*args, **kwargs) - worker.reloader._callback = new_callback + if worker.reloader: #So if reload = True + to_override = worker.reloader._callback + def new_callback(*args, **kwargs): + AsyncronWorker.stop( reason = "Auto Reload" ) + return to_override(*args, **kwargs) + worker.reloader._callback = new_callback return init_to_override( *args, **kwargs ) AsyncronWorker.init = init diff --git a/asyncron/workers.py b/asyncron/workers.py index 2eccf8b..68ac6f3 100644 --- a/asyncron/workers.py +++ b/asyncron/workers.py @@ -357,10 +357,12 @@ class AsyncronWorker: async for task in Ts: - locked = await Task.objects.filter( id = task.id ).filter( - models.Q(worker_lock = None) | - models.Q(worker_lock = self.model) #This is incase the lock has been aquired for some reason before. - ).aupdate( worker_lock = self.model ) + try: + locked = await Task.objects.filter( id = task.id ).filter( + models.Q(worker_lock = None) | + 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 trace = task.new_trace()