Browse Source

perf: 优化 delay_run 执行

pull/12577/head^2
Eric 10 months ago committed by 老广
parent
commit
f74f8b7d8c
  1. 16
      apps/authentication/backends/drf.py
  2. 11
      apps/common/decorators.py

16
apps/authentication/backends/drf.py

@ -10,6 +10,7 @@ from rest_framework import authentication, exceptions
from common.auth import signature from common.auth import signature
from common.decorators import merge_delay_run from common.decorators import merge_delay_run
from common.utils import get_object_or_none, get_request_ip_or_data, contains_ip from common.utils import get_object_or_none, get_request_ip_or_data, contains_ip
from users.models import User
from ..models import AccessKey, PrivateToken from ..models import AccessKey, PrivateToken
@ -19,20 +20,21 @@ def date_more_than(d, seconds):
@merge_delay_run(ttl=60) @merge_delay_run(ttl=60)
def update_token_last_used(tokens=()): def update_token_last_used(tokens=()):
for token in tokens: access_keys_ids = [token.id for token in tokens if isinstance(token, AccessKey)]
token.date_last_used = timezone.now() private_token_keys = [token.key for token in tokens if isinstance(token, PrivateToken)]
token.save(update_fields=['date_last_used']) if len(access_keys_ids) > 0:
AccessKey.objects.filter(id__in=access_keys_ids).update(date_last_used=timezone.now())
if len(private_token_keys) > 0:
PrivateToken.objects.filter(key__in=private_token_keys).update(date_last_used=timezone.now())
@merge_delay_run(ttl=60) @merge_delay_run(ttl=60)
def update_user_last_used(users=()): def update_user_last_used(users=()):
for user in users: User.objects.filter(id__in=users).update(date_api_key_last_used=timezone.now())
user.date_api_key_last_used = timezone.now()
user.save(update_fields=['date_api_key_last_used'])
def after_authenticate_update_date(user, token=None): def after_authenticate_update_date(user, token=None):
update_user_last_used(users=(user,)) update_user_last_used(users=(user.id,))
if token: if token:
update_token_last_used(tokens=(token,)) update_token_last_used(tokens=(token,))

11
apps/common/decorators.py

@ -101,7 +101,10 @@ def run_debouncer_func(cache_key, org, ttl, func, *args, **kwargs):
first_run_time = current first_run_time = current
if current - first_run_time > ttl: if current - first_run_time > ttl:
_loop_debouncer_func_args_cache.pop(cache_key, None)
_loop_debouncer_func_task_time_cache.pop(cache_key, None)
executor.submit(run_func_partial, *args, **kwargs) executor.submit(run_func_partial, *args, **kwargs)
logger.debug('executor submit run {}'.format(func.__name__,))
return return
loop = _loop_thread.get_loop() loop = _loop_thread.get_loop()
@ -136,10 +139,12 @@ class Debouncer(object):
def _run_func_with_org(key, org, func, *args, **kwargs): def _run_func_with_org(key, org, func, *args, **kwargs):
from orgs.utils import set_current_org from orgs.utils import set_current_org
try: try:
set_current_org(org) with transaction.atomic():
func(*args, **kwargs) set_current_org(org)
func(*args, **kwargs)
except Exception as e: except Exception as e:
logger.error('delay run error: %s' % e) logger.error('thread {} delay run {} error: {}'.format(
threading.current_thread(), func.__name__, e))
_loop_debouncer_func_task_cache.pop(key, None) _loop_debouncer_func_task_cache.pop(key, None)
_loop_debouncer_func_args_cache.pop(key, None) _loop_debouncer_func_args_cache.pop(key, None)
_loop_debouncer_func_task_time_cache.pop(key, None) _loop_debouncer_func_task_time_cache.pop(key, None)

Loading…
Cancel
Save