我目前正在尝试升级Web应用程序的工作版本,并且遇到了一个任务,该任务在单个HTTP请求期间完成需要花费太长时间的问题。应用程序通过HTTP Post操作从JavaScript前端获取JSON列表,然后返回该列表的排序/切片版本。随着输入列表变长,排序操作将花费更长的时间(显然),因此在适当长的输入列表上,我遇到了60秒的HTTP请求超时,应用程序失败了。
我想开始使用延迟库执行排序任务,但是在执行该任务之后,我不清楚如何存储/检索数据。这是我当前的代码:
class getLineups(webapp2.RequestHandler):
def post(self):
jsonstring = self.request.body
inputData = json.loads(jsonstring)
playerList = inputData["pList"]
positions = ["QB","RB","WR","TE","DST"]
playersPos = sortByPos(playerList,positions)
rosters, playerUse = getNFLRosters(playersPos, positions)
try:
# This step is computationally expensive, it will fail on large player lists.
lineups = makeLineups(rosters,playerUse,50000)
self.response.headers["Content-Type"] = "application/json"
self.response.out.write(json.dumps(lineups))
except:
logging.error("60 second timeout reached on player list of length:", len(playerList))
self.response.headers["Content-Type"] = "text/plain"
self.response.set_status(504)
app = webapp2.WSGIApplication([
('/lineup',getLineups),
], debug = True)
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想用对延迟任务库的调用来替换整个try / except块:
deferred.defer(makeLineups,rosters,playerUse,50000)
Run Code Online (Sandbox Code Playgroud)
但是我不清楚如何从该操作中获得结果。我在想必须将其存储在数据存储中,然后再检索它,但是我的JavaScript前端如何知道操作何时完成?我已经阅读了Google网站上的文档,但对于如何完成此任务仍然不甚了解。
使用公认的答案中的基本轮廓,这是我解决此问题的方法:
def …Run Code Online (Sandbox Code Playgroud) javascript python google-app-engine google-app-engine-python