1

我想加快我的 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 请求。

4

1 回答 1

2

我是 Django Facebook 的作者,我遇到了同样的问题。如果您想并行请求网址(更快),我认为最好的解决方案是使用 eventlet。我们也使用 celery,但我们主要使用它在后台运行东西。

于 2011-09-20T07:39:10.240 回答