import gevent import datetime import numpy as np from config import set_config from log import Log from utils import RedisHelper config_, _ = set_config() log_ = Log() redis_helper = RedisHelper() def update_limit_video_score(initial_videos): """ 调整限流视频的分数: 将视频移至所在列表的中位数之后,多个视频时,按照原本的顺序进行排列 :param initial_videos: 视频列表及score type-dict, {videoId: score, ...} :return: """ if not initial_videos: return # 获取当前限流视频 data = redis_helper.get_data_from_redis(key_name=config_.KEY_NAME_PREFIX_LIMIT_VIDEOS) if data is None: return initial_videos # 获取限流视频对应的score limit_video_initial_score = [] for video in eval(data): video_id = int(video[0]) initial_score = initial_videos.get(video_id, None) if initial_score is not None: limit_video_initial_score.append((video_id, initial_score)) log_.info(f"limit_video_initial_score = {limit_video_initial_score}") if len(limit_video_initial_score) == 0: return initial_videos # 获取原始列表的分数的中位数 initial_video_score_list = sorted([val for key, val in initial_videos.items()], reverse=False) media_score = np.median(initial_video_score_list) # 取中位数后一位 if len(initial_video_score_list) % 2 == 0: temp_index = len(initial_video_score_list)//2 else: temp_index = len(initial_video_score_list) // 2 + 1 if len(initial_video_score_list) > 1: temp_score = initial_video_score_list[temp_index] else: temp_score = 0 # 对限流视频score进行调整 limit_video_final_score = {} limit_video_initial_score.sort(key=lambda x: x[1], reverse=True) limit_video_id_list = [] for video_id, initial_score in limit_video_initial_score: if initial_score > media_score: limit_video_id_list.append(video_id) if len(limit_video_id_list) > 0: limit_score_step = (temp_score - media_score) / (len(limit_video_id_list) + 1) for i, video_id in enumerate(limit_video_id_list): final_score = media_score - limit_score_step * (i + 1) limit_video_final_score[int(video_id)] = final_score initial_videos[int(video_id)] = final_score log_.info(f"media_score = {media_score}, temp_score = {temp_score}, " f"limit_video_final_score = {limit_video_final_score}") return initial_videos