我想加快我的 django 视图处理速度,在视图中我必须进行几个 Web 服务调用(在我的情况下是 facebook graph api),这确实需要相当长的时间来处理(渲染视图大约需要 15-16 秒其中大部分用于从 facebook 获取数据)。所以而不是
def view(request):
if new_user
#facebook graph api call becomes the bottleneck
profile = facebook.graph_api_call('profile information')
friends = facebook.graph_api_call('get some more information like friends')
some lengthy processing of friends
...
facebook.graph_api_call('yet some more information')
#Finally pass the profile to template to render user details
render_to_response('mytemplate', { 'profile': profile })
我想这样做:
@task
def get_profile():
profile = facebook.graph_api_call('profile information')
return profile
def view(request):
if new_user
profile_task = get_profile.delay()
friends = facebook.graph_api_call('get some more information like friends')
some really lengthy processing of friends
...
facebook.graph_api_call('yet some more information')
#Wait for profile task to complete
profile_task.get()
#Finally pass the profile to template to render user details
render_to_response('mytemplate', { 'profile': profile })
这样我就可以继续对朋友数据的处理,而无需等待检索个人资料信息。但是如果 celery worker(s) 很忙,那么它可能不会立即获取配置文件数据,因此视图的渲染可能比以前的方法花费更多甚至更多的时间。
第三种方法可能是与方法 2 中的所有操作相同,但如果任务尚未启动,则取消该任务并进行常规函数调用,而不是启动任务以获取配置文件信息。
以防万一有人建议使用 facebook 批处理请求获取个人资料和朋友信息:在我的情况下这是不可能的,因为上面的代码只是一个片段。当用户第一次访问我的应用程序时,我实际上是在中间件中获取配置文件。
我不确定以上 3 种方法中哪种方法更好。请建议是否有其他方法可以并行化 Web 请求。