ビューでいくつかの Web サービス呼び出し (私の場合は facebook グラフ API) を行う必要がある場合、django ビューの処理を高速化したいと考えています。これは、処理にかなりの時間がかかります (ビューをレンダリングするだけで約 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 })
このようにして、プロフィール情報が取得されるのを待たずに友達データの処理を進めることができます。ただし、セロリ ワーカーがビジー状態の場合、プロファイル データをすぐに取得できない可能性があるため、ビューのレンダリングに以前のアプローチよりもさらに時間がかかる可能性があります。
3 番目のアプローチは、アプローチ 2 と同じことをすべて実行することですが、タスクがまだ開始されていない場合はタスクをキャンセルし、タスクを起動してプロファイル情報を取得する代わりに通常の関数呼び出しを行います。
誰かが Facebook のバッチ リクエストを使用してプロファイルと友人の情報を取得することを提案した場合に備えて: 上記のコードは単なるスニペットであるため、私の場合は不可能です。ユーザーが最初にアプリにアクセスしたときに、実際にミドルウェアでプロファイルを取得しています。
上記の3つのアプローチのうち、どちらが優れているかはわかりません。Web リクエストを並列化する他の方法があるかどうかを提案してください。