import random import time import multiprocessing from datetime import date, timedelta from log import Log from db_helper import RedisHelper from config import set_config from utils import FilterVideos, get_videos_remain_view_count log_ = Log() config_ = set_config() def video_recommend(mid, uid, size, app_type, algo_type): """ 首页线上推荐逻辑 :param mid: mid type-string :param uid: uid type-string :param size: 请求视频数量 type-int :param app_type: 产品标识 type-int :param algo_type: 算法类型 type-string :return: """ # 多进程召回 start_recall = time.time() cores = multiprocessing.cpu_count() pool = multiprocessing.Pool(processes=cores) pool_recall = PoolRecall(app_type=app_type, mid=mid, uid=uid) pool_list = [ # rov召回池 pool.apply_async(pool_recall.rov_pool_recall, size), # 流量池 pool.apply_async(pool_recall.flow_pool_recall, size) ] recall_result_list = [p.get() for p in pool_list] pool.close() pool.join() end_recall = time.time() log_.info('mid: {}, uid: {}, recall: {}, execute time = {}ms'.format( mid, uid, recall_result_list, (end_recall - start_recall) * 1000)) # 排序 data = { 'rov_pool_recall': recall_result_list[0], 'flow_pool_recall': recall_result_list[1] } # 1. 从ROV召回池中获取 size 个视频, 过滤 # 2. 从流量池中获取 size-K 个视频,过滤,剩余可分发数 > 0 # 3. 排序,topK 召回池视频,size-K 按概率 P 从流量池中获取视频 pass