recommend.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import random
  2. import time
  3. import multiprocessing
  4. from datetime import date, timedelta
  5. from log import Log
  6. from db_helper import RedisHelper
  7. from config import set_config
  8. from utils import FilterVideos, get_videos_remain_view_count
  9. log_ = Log()
  10. config_ = set_config()
  11. def video_recommend(mid, uid, size, app_type, algo_type):
  12. """
  13. 首页线上推荐逻辑
  14. :param mid: mid type-string
  15. :param uid: uid type-string
  16. :param size: 请求视频数量 type-int
  17. :param app_type: 产品标识 type-int
  18. :param algo_type: 算法类型 type-string
  19. :return:
  20. """
  21. # 多进程召回
  22. start_recall = time.time()
  23. cores = multiprocessing.cpu_count()
  24. pool = multiprocessing.Pool(processes=cores)
  25. pool_recall = PoolRecall(app_type=app_type, mid=mid, uid=uid)
  26. pool_list = [
  27. # rov召回池
  28. pool.apply_async(pool_recall.rov_pool_recall, size),
  29. # 流量池
  30. pool.apply_async(pool_recall.flow_pool_recall, size)
  31. ]
  32. recall_result_list = [p.get() for p in pool_list]
  33. pool.close()
  34. pool.join()
  35. end_recall = time.time()
  36. log_.info('mid: {}, uid: {}, recall: {}, execute time = {}ms'.format(
  37. mid, uid, recall_result_list, (end_recall - start_recall) * 1000))
  38. # 排序
  39. data = {
  40. 'rov_pool_recall': recall_result_list[0],
  41. 'flow_pool_recall': recall_result_list[1]
  42. }
  43. # 1. 从ROV召回池中获取 size 个视频, 过滤
  44. # 2. 从流量池中获取 size-K 个视频,过滤,剩余可分发数 > 0
  45. # 3. 排序,topK 召回池视频,size-K 按概率 P 从流量池中获取视频
  46. pass