use cache locks
This commit is contained in:
parent
7257ea3327
commit
71d7ea7147
@ -7,7 +7,7 @@ from feeds.modules import EchoFeedModuleConfig, DankMemesFeedModuleConfig, Shitt
|
|||||||
|
|
||||||
@admin.register(Feed)
|
@admin.register(Feed)
|
||||||
class FeedAdmin(admin.ModelAdmin):
|
class FeedAdmin(admin.ModelAdmin):
|
||||||
list_display = '__str__', 'lock',
|
list_display = '__str__', 'locked',
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(EchoFeedModuleConfig)
|
admin.site.register(EchoFeedModuleConfig)
|
||||||
|
17
feeds/migrations/0007_remove_feed_lock.py
Normal file
17
feeds/migrations/0007_remove_feed_lock.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Generated by Django 2.1.5 on 2019-11-24 14:07
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('feeds', '0006_tapasfeedmoduleconfig'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='feed',
|
||||||
|
name='lock',
|
||||||
|
),
|
||||||
|
]
|
@ -1,6 +1,7 @@
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
|
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
|
from django.core.cache import cache
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from telebot import TeleBot
|
from telebot import TeleBot
|
||||||
@ -16,20 +17,26 @@ class Feed(models.Model):
|
|||||||
check_interval = models.DurationField(help_text='in seconds')
|
check_interval = models.DurationField(help_text='in seconds')
|
||||||
last_check = models.DateTimeField(null=True, blank=True)
|
last_check = models.DateTimeField(null=True, blank=True)
|
||||||
last_id = YAMLField(null=True, blank=True)
|
last_id = YAMLField(null=True, blank=True)
|
||||||
lock = models.BooleanField(default=False)
|
|
||||||
|
|
||||||
config_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
|
config_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
|
||||||
config_id = models.PositiveIntegerField()
|
config_id = models.PositiveIntegerField()
|
||||||
config = GenericForeignKey('config_type', 'config_id')
|
config = GenericForeignKey('config_type', 'config_id')
|
||||||
|
|
||||||
|
@property
|
||||||
|
def lock_key(self):
|
||||||
|
return 'feed-{}-lock'.format(self.pk)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def locked(self):
|
||||||
|
return bool(cache.get(self.lock_key))
|
||||||
|
|
||||||
def run_check(self):
|
def run_check(self):
|
||||||
if self.lock:
|
if self.locked:
|
||||||
return False
|
return False
|
||||||
if self.last_check and timezone.now() < self.last_check + self.check_interval:
|
if self.last_check and timezone.now() < self.last_check + self.check_interval:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
self.lock = True
|
cache.set(self.lock_key, 1, timeout=60)
|
||||||
self.save()
|
|
||||||
execute_feed.apply_async(args=(self.pk,), shadow=str(self))
|
execute_feed.apply_async(args=(self.pk,), shadow=str(self))
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
import sentry_sdk
|
import sentry_sdk
|
||||||
from celery.exceptions import Reject
|
|
||||||
from celery_once import QueueOnce
|
from celery_once import QueueOnce
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
from django.core.cache import cache
|
||||||
from telebot import TeleBot
|
from telebot import TeleBot
|
||||||
from djconfig import config
|
from djconfig import config
|
||||||
|
|
||||||
@ -14,7 +14,7 @@ from config.celery import app
|
|||||||
def check_feeds():
|
def check_feeds():
|
||||||
from feeds.models import Feed
|
from feeds.models import Feed
|
||||||
|
|
||||||
feeds = Feed.objects.filter(lock=False)
|
feeds = Feed.objects.all()
|
||||||
enqueued = []
|
enqueued = []
|
||||||
for feed in feeds:
|
for feed in feeds:
|
||||||
if feed.run_check():
|
if feed.run_check():
|
||||||
@ -47,5 +47,4 @@ def execute_feed(feed_pk):
|
|||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
finally:
|
finally:
|
||||||
if feed:
|
if feed:
|
||||||
feed.lock = False
|
cache.delete(feed.lock_key)
|
||||||
feed.save()
|
|
||||||
|
Loading…
Reference in New Issue
Block a user