Conflicts:
	services/managers/eve_api_manager.py
This commit is contained in:
Adarnof 2016-12-13 20:31:13 -05:00
commit 046ecce8a3
2 changed files with 32 additions and 0 deletions

View File

@ -9,6 +9,7 @@ zeroc-ice
slugify slugify
requests-oauthlib requests-oauthlib
sleekxmpp sleekxmpp
redis
# Django Stuff # # Django Stuff #
django>=1.10,<2.0 django>=1.10,<2.0

View File

@ -25,9 +25,38 @@ from notifications import notify
from celery.task import periodic_task from celery.task import periodic_task
from celery.task.schedules import crontab from celery.task.schedules import crontab
from eveonline.managers import EveManager from eveonline.managers import EveManager
import redis
REDIS_CLIENT = redis.Redis()
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# http://loose-bits.com/2010/10/distributed-task-locking-in-celery.html
def only_one(function=None, key="", timeout=None):
"""Enforce only one celery task at a time."""
def _dec(run_func):
"""Decorator."""
def _caller(*args, **kwargs):
"""Caller."""
ret_value = None
have_lock = False
lock = REDIS_CLIENT.lock(key, timeout=timeout)
try:
have_lock = lock.acquire(blocking=False)
if have_lock:
ret_value = run_func(*args, **kwargs)
finally:
if have_lock:
lock.release()
return ret_value
return _caller
return _dec(function) if function is not None else _dec
@periodic_task(run_every=crontab(minute="*/30")) @periodic_task(run_every=crontab(minute="*/30"))
def run_ts3_group_update(): def run_ts3_group_update():
@ -410,6 +439,7 @@ def update_all_teamspeak3_groups():
@task(bind=True) @task(bind=True)
@only_one(key="Discord", timeout=60*5)
def update_discord_groups(self, pk): def update_discord_groups(self, pk):
user = User.objects.get(pk=pk) user = User.objects.get(pk=pk)
logger.debug("Updating discord groups for user %s" % user) logger.debug("Updating discord groups for user %s" % user)
@ -459,6 +489,7 @@ def update_all_discord_nicknames():
@task(bind=True) @task(bind=True)
@only_one(key="Discourse", timeout=60*5)
def update_discourse_groups(self, pk): def update_discourse_groups(self, pk):
user = User.objects.get(pk=pk) user = User.objects.get(pk=pk)
logger.debug("Updating discourse groups for user %s" % user) logger.debug("Updating discourse groups for user %s" % user)