Skip to content

Commit

Permalink
Use new scheduler for real
Browse files Browse the repository at this point in the history
  • Loading branch information
SupraSummus committed Feb 2, 2025
1 parent d4e6cec commit 260e89c
Show file tree
Hide file tree
Showing 9 changed files with 22 additions and 48 deletions.
6 changes: 3 additions & 3 deletions django_scheduler/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ def run(local_jobs=None, blocking=True):
else:
next_run = now
queue.append((next_run, local_job))
queue.sort()
queue.sort(key=lambda x: x[0])
del db_jobs
del local_jobs

Expand All @@ -89,7 +89,7 @@ def run(local_jobs=None, blocking=True):
db_job = run_job(local_job)

queue.append((db_job.last_run + local_job.interval, local_job))
queue.sort()
queue.sort(key=lambda x: x[0])


def get_or_create_db_jobs(local_jobs):
Expand Down Expand Up @@ -127,6 +127,6 @@ def run_job(local_job):

logger.info("Running job %s", local_job.key)
db_job.last_run = now
local_job.handler(now)
local_job.handler(now=now)
db_job.save(update_fields=['last_run'])
return db_job
4 changes: 2 additions & 2 deletions django_scheduler/models_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def sample_handler(now):

def test_register_job():
"""Test job registration and automatic key generation"""
assert not _local_jobs
_local_jobs.clear()

register_job(sample_handler, timedelta(minutes=30))
assert len(_local_jobs) == 1
Expand All @@ -50,7 +50,7 @@ def test_run_executes_job_immediately():
run([local_job], blocking=False)

assert mock_handler.call_count == 1
now = mock_handler.call_args[0][0]
now = mock_handler.call_args.kwargs["now"]

db_job = Job.objects.get(key="test_job")
assert db_job.last_run == now
Expand Down
3 changes: 3 additions & 0 deletions warriors/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,6 @@

class WarriorsConfig(AppConfig):
name = "warriors"

def ready(self):
import warriors.scheduler # noqa
2 changes: 1 addition & 1 deletion warriors/challenge_matchmaking.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
logger = logging.getLogger(__name__)


def schedule_losing_battle_top():
def schedule_losing_battle_top(now=None):
for arena in Arena.objects.all():
battle = schedule_losing_battle_arena(arena)
logger.info('Scheduled battle %s', battle)
Expand Down
12 changes: 0 additions & 12 deletions warriors/management/commands/scheduler.py

This file was deleted.

2 changes: 1 addition & 1 deletion warriors/rating_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ def normalize_playstyle_len(playstyle):
assert len(playstyle) == M_ELO_K * 2


def update_rating(n=10):
def update_rating(n=10, now=None):
from .models import WarriorArena
errors = []
for _ in range(n):
Expand Down
34 changes: 8 additions & 26 deletions warriors/scheduler.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,15 @@
import logging
import sched
from datetime import timedelta

from django_scheduler.models import register_job

from .challenge_matchmaking import schedule_losing_battle_top
from .rating_models import update_rating
from .stats import create_arena_stats
from .tasks import schedule_battle, schedule_battles_top


logger = logging.getLogger(__name__)


class Scheduler(sched.scheduler):
def enter_recurring(self, delay, priority, action, argument=(), kwargs={}):
action(*argument, **kwargs)
self.enter(delay, priority, self.enter_recurring, (delay, priority, action, argument, kwargs))

def run(self, *args, **kwargs):
logger.info('Starting scheduler')
return super().run(*args, **kwargs)

def clear(self):
logger.info('Clearing scheduler')
with self._lock:
self._queue.clear()


scheduler = Scheduler()
scheduler.enter_recurring(1, 0, schedule_battle)
scheduler.enter_recurring(60 * 10, 0, schedule_battles_top)
scheduler.enter_recurring(60, 0, update_rating)
scheduler.enter_recurring(60 * 60, 0, create_arena_stats)
scheduler.enter_recurring(60 * 10, 0, schedule_losing_battle_top)
register_job(schedule_battle, timedelta(seconds=1))
register_job(schedule_battles_top, timedelta(minutes=10))
register_job(update_rating, timedelta(minutes=1))
register_job(create_arena_stats, timedelta(hours=1))
register_job(schedule_losing_battle_top, timedelta(minutes=10))
5 changes: 3 additions & 2 deletions warriors/stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,10 @@ def rating_quantile_labels():
return [i / 100 for i in range(101)]


def create_arena_stats():
def create_arena_stats(now=None):
from .models import Arena
now = timezone.now()
if now is None:
now = timezone.now()
for arena in Arena.objects.all():
create_arena_stats_for_arena(arena, now)

Expand Down
2 changes: 1 addition & 1 deletion warriors/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def schedule_battle(now=None):
warrior.create_battle(opponent, now=now)


def schedule_battles_top():
def schedule_battles_top(now=None):
for arena in Arena.objects.all():
schedule_battle_top_arena(arena.id)

Expand Down

0 comments on commit 260e89c

Please sign in to comment.