用django芹菜并行化任务

时间:2011-09-20 05:39:32

标签: django facebook-graph-api celery django-celery

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

1 个答案:

答案 0 :(得分:2)

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