mirror of
https://github.com/khoj-ai/khoj.git
synced 2024-11-23 15:38:55 +01:00
Use Django ap scheduler in place of the sqlalchemy one
This commit is contained in:
parent
06213ea814
commit
eb65532386
4 changed files with 23 additions and 7 deletions
|
@ -83,6 +83,7 @@ dependencies = [
|
||||||
"apscheduler ~= 3.10.0",
|
"apscheduler ~= 3.10.0",
|
||||||
"pytz ~= 2024.1",
|
"pytz ~= 2024.1",
|
||||||
"cron-descriptor == 1.4.3",
|
"cron-descriptor == 1.4.3",
|
||||||
|
"django_apscheduler == 0.6.2",
|
||||||
]
|
]
|
||||||
dynamic = ["version"]
|
dynamic = ["version"]
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,7 @@ INSTALLED_APPS = [
|
||||||
"django.contrib.messages",
|
"django.contrib.messages",
|
||||||
"django.contrib.staticfiles",
|
"django.contrib.staticfiles",
|
||||||
"phonenumber_field",
|
"phonenumber_field",
|
||||||
|
"django_apscheduler",
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
|
@ -169,3 +170,20 @@ STATIC_URL = "/static/"
|
||||||
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
|
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
|
||||||
|
|
||||||
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
|
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
|
||||||
|
|
||||||
|
|
||||||
|
# Format string for displaying run time timestamps in the Django admin site. The default
|
||||||
|
# just adds seconds to the standard Django format, which is useful for displaying the timestamps
|
||||||
|
# for jobs that are scheduled to run on intervals of less than one minute.
|
||||||
|
#
|
||||||
|
# See https://docs.djangoproject.com/en/dev/ref/settings/#datetime-format for format string
|
||||||
|
# syntax details.
|
||||||
|
APSCHEDULER_DATETIME_FORMAT = "N j, Y, f:s a"
|
||||||
|
|
||||||
|
# Maximum run time allowed for jobs that are triggered manually via the Django admin site, which
|
||||||
|
# prevents admin site HTTP requests from timing out.
|
||||||
|
#
|
||||||
|
# Longer running jobs should probably be handed over to a background task processing library
|
||||||
|
# that supports multiple background worker processes instead (e.g. Dramatiq, Celery, Django-RQ,
|
||||||
|
# etc. See: https://djangopackages.org/grids/g/workers-queues-tasks/ for popular options).
|
||||||
|
APSCHEDULER_RUN_NOW_TIMEOUT = 240 # Seconds
|
||||||
|
|
|
@ -128,20 +128,16 @@ def run(should_start_server=True):
|
||||||
poll_task_scheduler()
|
poll_task_scheduler()
|
||||||
|
|
||||||
# Setup Background Scheduler
|
# Setup Background Scheduler
|
||||||
from django.conf import settings as django_settings
|
from django_apscheduler.jobstores import DjangoJobStore
|
||||||
|
|
||||||
django_db = django_settings.DATABASES["default"]
|
|
||||||
state.scheduler = BackgroundScheduler(
|
state.scheduler = BackgroundScheduler(
|
||||||
{
|
{
|
||||||
"apscheduler.jobstores.default": {
|
|
||||||
"type": "sqlalchemy",
|
|
||||||
"url": f'postgresql://{django_db["USER"]}:{django_db["PASSWORD"]}@{django_db["HOST"]}:{django_db["PORT"]}/{django_db["NAME"]}',
|
|
||||||
},
|
|
||||||
"apscheduler.timezone": "UTC",
|
"apscheduler.timezone": "UTC",
|
||||||
"apscheduler.job_defaults.misfire_grace_time": "60", # Useful to run scheduled jobs even when worker delayed because it was busy or down
|
"apscheduler.job_defaults.misfire_grace_time": "60", # Useful to run scheduled jobs even when worker delayed because it was busy or down
|
||||||
"apscheduler.job_defaults.coalesce": "true", # Combine multiple jobs into one if they are scheduled at the same time
|
"apscheduler.job_defaults.coalesce": "true", # Combine multiple jobs into one if they are scheduled at the same time
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
state.scheduler.add_jobstore(DjangoJobStore(), "default")
|
||||||
state.scheduler.start()
|
state.scheduler.start()
|
||||||
|
|
||||||
# Start Server
|
# Start Server
|
||||||
|
|
|
@ -25,6 +25,7 @@ import openai
|
||||||
import pytz
|
import pytz
|
||||||
import requests
|
import requests
|
||||||
from apscheduler.triggers.cron import CronTrigger
|
from apscheduler.triggers.cron import CronTrigger
|
||||||
|
from asgiref.sync import sync_to_async
|
||||||
from fastapi import Depends, Header, HTTPException, Request, UploadFile
|
from fastapi import Depends, Header, HTTPException, Request, UploadFile
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from starlette.authentication import has_required_scope
|
from starlette.authentication import has_required_scope
|
||||||
|
@ -927,7 +928,7 @@ async def create_automation(
|
||||||
)
|
)
|
||||||
query_id = hashlib.md5(f"{query_to_run}".encode("utf-8")).hexdigest()
|
query_id = hashlib.md5(f"{query_to_run}".encode("utf-8")).hexdigest()
|
||||||
job_id = f"automation_{user.uuid}_{crontime_string}_{query_id}"
|
job_id = f"automation_{user.uuid}_{crontime_string}_{query_id}"
|
||||||
job = state.scheduler.add_job(
|
job = await sync_to_async(state.scheduler.add_job)(
|
||||||
run_with_process_lock,
|
run_with_process_lock,
|
||||||
trigger=trigger,
|
trigger=trigger,
|
||||||
args=(
|
args=(
|
||||||
|
|
Loading…
Reference in a new issue