mirror of
https://github.com/django-q2/django-q2.git
synced 2026-10-11 03:00:56 +08:00
Lock the Schedule objects to ensure tasks are created once
Tested this with PostgreSQL and MySQL
This commit is contained in:
+3
-4
@@ -491,7 +491,8 @@ def scheduler(broker=None):
|
||||
broker = get_broker()
|
||||
db.close_old_connections()
|
||||
try:
|
||||
for s in Schedule.objects.exclude(repeats=0).filter(next_run__lt=timezone.now()):
|
||||
with db.transaction.atomic():
|
||||
for s in Schedule.objects.select_for_update().exclude(repeats=0).filter(next_run__lt=timezone.now()):
|
||||
args = ()
|
||||
kwargs = {}
|
||||
# get args, kwargs and hook
|
||||
@@ -529,9 +530,7 @@ def scheduler(broker=None):
|
||||
next_run = next_run.shift(years=+1)
|
||||
if Conf.CATCH_UP or next_run > arrow.utcnow():
|
||||
break
|
||||
# arrow always returns a tz aware datetime, and we don't want
|
||||
# this when we explicitly configured django with USE_TZ=False
|
||||
s.next_run = next_run.datetime if settings.USE_TZ else next_run.datetime.replace(tzinfo=None)
|
||||
s.next_run = next_run.datetime
|
||||
s.repeats += -1
|
||||
# send it to the cluster
|
||||
q_options['broker'] = broker
|
||||
|
||||
Reference in New Issue
Block a user