我需要和api交谈才能获得有关团队的信息。每个团队都有一个独特的身份。我用那个id叫api,然后我得到每个团队的队员名单(dicts列表)。玩家的关键之一是我可以用来获取有关该玩家的更多信息的另一个ID。我可以捆绑所有这些player_id并打电话给api,以便在一次api通话中获得每位玩家的所有附加信息。
我的问题是: 我希望团队数量增长,可能会非常大。此外,每支球队的球员数量也会增加。
将这些api调用同时发送到api的最佳方法是什么?我可以使用multiprocessing.dummy中的ThreadPool,我也看过genvent用于这样的事情。
对api的调用需要一些时间才能获得返回值(每次批量api调用需要1-2秒)。
现在,我的工作是:
for each team:
get the list of players
store the player_ids in a list
get the player information for all the players (passing the list of player_ids)
assemble and process the information
如果我使用ThreadPool,我可以执行以下操作:
create a ThreadPool of size x
result = pool.map(function_to_get_team_info, list of teams)
pool.close()
pool.join()
#process results
def function_to_get_team_info(team_id):
players = api.call(team_id)
player_info = get_players_information(players)
return player_info
def get_players_information(players):
player_ids = []
for player in players:
player_ids.append(player['id'])
return get_all_player_stats(player_ids)
def get_all_player_stats(players_id):
return api.call(players_id)
这会同时处理每个团队,并在ThreadPool结果中汇总所有信息。
为了使这个完全并发,我想我需要让我的ThreadPool达到团队数量的大小。但我认为这不会很好。所以,我想知道我是否使用gevent处理这些信息,如果这是一个更好的方法。
非常欢迎任何建议
答案 0 :(得分:6)
一种解决方案是:
此解决方案可以保护您免受特定团队处理时的影响。 100个时间单位,当其他球队以1个时间单位(平均)处理时。
您可以根据团队数量,平均团队处理时间,CPU核心数等来调整线程工作者的数量。
扩展答案
这可以通过Python multiprocessing.Pool
:
from multiprocessing import Pool
def api_call(id):
pass # call API for given id
if __name__ == '__main__':
p = Pool(5)
p.map(api_call, [1, 2, 3])