import json import random import time import math import gevent from db_helper import RedisHelper from config import set_config from log import Log from gevent import monkey, pool monkey.patch_all() config_ = set_config() log_ = Log() redis_helper = RedisHelper() def thompson_process(creative_id): # 获取creative_id对应的Thompson参数 thompson_param_initial = redis_helper.get_data_from_redis(key_name=f"{config_.THOMPSON_PARAM_KEY_PREFIX}{creative_id}") if thompson_param_initial is None or thompson_param_initial == '': # 参数不存在,获取默认参数 thompson_param = redis_helper.get_data_from_redis(key_name=f"{config_.THOMPSON_PARAM_KEY_PREFIX}-1") param_alpha, param_beta = json.loads(thompson_param.strip()) param_alpha, param_beta = int(param_alpha), int(param_beta) random_flag = 'initial_random' else: # 参数存在 param_alpha, param_beta = json.loads(thompson_param_initial.strip()) param_alpha, param_beta = int(param_alpha), int(param_beta) if param_alpha + param_beta >= 100: # ad_idea_id 曝光数 >= 100,生成参数为(param_alpha+1, param_beta+1)的beta分布随机数 thompson_param = thompson_param_initial random_flag = 'beta' else: # ad_idea_id 曝光数 < 100,获取默认参数 thompson_param = redis_helper.get_data_from_redis(key_name=f"{config_.THOMPSON_PARAM_KEY_PREFIX}-1") param_alpha, param_beta = json.loads(thompson_param.strip()) param_alpha, param_beta = int(param_alpha), int(param_beta) random_flag = 'under_view_initial_random' # 生成参数为(param_alpha+1, param_beta+1)的beta分布随机数 alpha = math.log(param_alpha + 1) + 1 beta = math.log(param_beta + 1) + 1 score = random.betavariate(alpha=alpha, beta=beta) betavariate_param = [alpha, beta] thompson_res = [creative_id, score, thompson_param_initial, thompson_param, betavariate_param, random_flag] return thompson_res def get_creative_id_with_thompson(mid, creative_id_list, gevent_pool): """利用Thompson采样获取此次要展示的广告创意ID""" # 限制协程最大并发数:20 tasks = [gevent_pool.spawn(thompson_process, creative_id) for creative_id in creative_id_list] gevent.joinall(tasks) thompson_res_list = [t.get() for t in tasks] # 按照score排序 thompson_res_rank = sorted(thompson_res_list, key=lambda x: x[1], reverse=True) rank_res = { 'mid': mid, 'creative_id': thompson_res_rank[0][0], 'score': thompson_res_rank[0][1], 'thompson_param_initial': thompson_res_rank[0][2], 'thompson_param': thompson_res_rank[0][3], 'betavariate_param': thompson_res_rank[0][4], 'random_flag': thompson_res_rank[0][5], 'thompson_res_rank': thompson_res_rank } return rank_res