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:
parent
9ee0798006
commit
386fc21f29
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user