|
@@ -1,8 +1,9 @@
|
|
|
import time
|
|
|
import os
|
|
|
+import traceback
|
|
|
|
|
|
from config import set_config
|
|
|
-from utils import request_post, filter_video_status
|
|
|
+from utils import request_post, filter_video_status, send_msg_to_feishu
|
|
|
from log import Log
|
|
|
from db_helper import RedisHelper
|
|
|
|
|
@@ -69,48 +70,53 @@ def predict(app_type):
|
|
|
:param app_type: 产品标识 type-int
|
|
|
:return: None
|
|
|
"""
|
|
|
- # 从流量池获取数据
|
|
|
- videos = get_videos_from_flow_pool(app_type=app_type)
|
|
|
- if len(videos) <= 0:
|
|
|
- log_.info('流量池中无需分发的视频')
|
|
|
- return None
|
|
|
- # video_id 与 flow_pool 进行mapping
|
|
|
- video_ids = set()
|
|
|
- log_.info('流量池中视频数:{}'.format(len(videos)))
|
|
|
- mapping = {}
|
|
|
- for video in videos:
|
|
|
- video_id = video['videoId']
|
|
|
- video_ids.add(video_id)
|
|
|
- if video_id in mapping:
|
|
|
- mapping[video_id].append(video['flowPool'])
|
|
|
- else:
|
|
|
- mapping[video_id] = [video['flowPool']]
|
|
|
-
|
|
|
- # 对视频状态进行过滤
|
|
|
- filtered_videos = filter_video_status(list(video_ids))
|
|
|
- log_.info('filter videos status finished, filtered_videos nums={}'.format(len(filtered_videos)))
|
|
|
- if not filtered_videos:
|
|
|
- log_.info('流量池中视频状态不符合分发')
|
|
|
- return None
|
|
|
- # 预测
|
|
|
- video_score = get_score(filtered_videos)
|
|
|
- log_.info('predict finished!')
|
|
|
- # 上传数据到redis
|
|
|
- redis_data = {}
|
|
|
- for i in range(len(video_score)):
|
|
|
- video_id = filtered_videos[i]
|
|
|
- score = video_score[i]
|
|
|
- for flow_pool in mapping.get(video_id):
|
|
|
- value = '{}-{}'.format(video_id, flow_pool)
|
|
|
- redis_data[value] = score
|
|
|
- key_name = config_.FLOWPOOL_KEY_NAME_PREFIX + str(app_type)
|
|
|
- redis_helper = RedisHelper()
|
|
|
- # 如果key已存在,删除key
|
|
|
- if redis_helper.key_exists(key_name):
|
|
|
- redis_helper.del_keys(key_name)
|
|
|
- # 写入redis
|
|
|
- redis_helper.add_data_with_zset(key_name=key_name, data=redis_data, expire_time=24 * 3600)
|
|
|
- log_.info('data to redis finished!')
|
|
|
+ try:
|
|
|
+ # 从流量池获取数据
|
|
|
+ videos = get_videos_from_flow_pool(app_type=app_type)
|
|
|
+ if len(videos) <= 0:
|
|
|
+ log_.info('流量池中无需分发的视频')
|
|
|
+ return None
|
|
|
+ # video_id 与 flow_pool 进行mapping
|
|
|
+ video_ids = set()
|
|
|
+ log_.info('流量池中视频数:{}'.format(len(videos)))
|
|
|
+ mapping = {}
|
|
|
+ for video in videos:
|
|
|
+ video_id = video['videoId']
|
|
|
+ video_ids.add(video_id)
|
|
|
+ if video_id in mapping:
|
|
|
+ mapping[video_id].append(video['flowPool'])
|
|
|
+ else:
|
|
|
+ mapping[video_id] = [video['flowPool']]
|
|
|
+
|
|
|
+ # 对视频状态进行过滤
|
|
|
+ filtered_videos = filter_video_status(list(video_ids))
|
|
|
+ log_.info('filter videos status finished, filtered_videos nums={}'.format(len(filtered_videos)))
|
|
|
+ if not filtered_videos:
|
|
|
+ log_.info('流量池中视频状态不符合分发')
|
|
|
+ return None
|
|
|
+ # 预测
|
|
|
+ video_score = get_score(filtered_videos)
|
|
|
+ log_.info('predict finished!')
|
|
|
+ # 上传数据到redis
|
|
|
+ redis_data = {}
|
|
|
+ for i in range(len(video_score)):
|
|
|
+ video_id = filtered_videos[i]
|
|
|
+ score = video_score[i]
|
|
|
+ for flow_pool in mapping.get(video_id):
|
|
|
+ value = '{}-{}'.format(video_id, flow_pool)
|
|
|
+ redis_data[value] = score
|
|
|
+ key_name = config_.FLOWPOOL_KEY_NAME_PREFIX + str(app_type)
|
|
|
+ redis_helper = RedisHelper()
|
|
|
+ # 如果key已存在,删除key
|
|
|
+ if redis_helper.key_exists(key_name):
|
|
|
+ redis_helper.del_keys(key_name)
|
|
|
+ # 写入redis
|
|
|
+ redis_helper.add_data_with_zset(key_name=key_name, data=redis_data, expire_time=24 * 3600)
|
|
|
+ log_.info('data to redis finished!')
|
|
|
+ except Exception as e:
|
|
|
+ log_.error('流量池更新失败, appType: {} exception: {}, traceback: {}'.format(
|
|
|
+ app_type, e, traceback.format_exc()))
|
|
|
+ send_msg_to_feishu('rov-offline生产环境 - 流量池更新失败, appType: {}, exception: {}'.format(app_type, e))
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|