我想加快我的django视图处理速度,在视图中我必须进行多次网络服务调用(在我的情况下是facebook图形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 })
这样,我可以继续处理好友数据,而无需等待检索个人资料信息。但是如果芹菜工人忙,那么它可能不会立即获取配置文件数据,因此视图的渲染可能比以前的方法花费更多的时间。
第三种方法可能是在方法2中执行所有操作,但如果任务尚未启动,则取消该任务并进行常规函数调用,而不是启动任务以获取配置文件信息。
以防万一有人建议使用facebook批量请求获取个人资料和朋友信息:在我的情况下,由于上面的代码只是一个片段,因此无法实现。当用户第一次访问我的应用程序时,我实际上是在中间件中获取配置文件。
我不确定上述3中哪种方法更好。请建议是否可以采用其他方式并行化Web请求。
答案 0 :(得分:2)
我是Django Facebook的作者,我遇到了同样的问题。我认为最好的解决方案是使用eventlet,如果你想并行请求url(更快)。我们也使用芹菜,但我们主要用它来在后台运行。