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