2017-09-03 20 views
0

多くのアイテム(〜100)ですべてを一度に見るのではなく、(時間がかかる)apiにクエリを実行したい。代わりに、私はクエリの間に少し遅延が欲しいです。Celery + Python:別のタスク内で時間のかかるタスクをキューに入れよう

私が現在持っていることは、クエリの上に非同期で繰り返し処理を実行し、各反復の後にいくつかの時間を待ってますタスクです:私の質問は、それらの要求の倍数が入って来たときに、第二の意志、ある

@shared_task 
def query_api_multiple(values): 
    delay_between_queries = 1 

    query_results = [] 

    for value in values: 
     time.sleep(delay_between_queries) 

     response = query_api(value) 
     if response['result']: 
      query_results.append(response) 

    return query_results 

最初の処理が終了した後、または最初の処理が実行されている間に要求が実行されますか?そして、彼らが同時に処刑されないとき、どうすればこれを達成できますか?

あなたが time.sleepを使うべきではありませんが、率ではなく、あなたのタスクを制限
+1

次のようなETA(予想到着時間)を使用して非同期的に行うために、ETA - 後でタスクをスケジュールする必要があります。 access_awful_system.apply_async((object_id)、eta =後で)[参考] ETA。 –

答えて

1

はい、あなたは複数のタスクを作成する場合、それらは同時に実行することがあります。

期間ごとに実行されるタスクの数を制限する場合は、セロリを使用してタスクタイプごとに制限を設定できます。セロリがOOtBを提供するものよりも柔軟性が必要な場合は、セロリの再試行と組み合わせたredisのようなものを使用してレート制限パターンを実装することもできます。

1

Task.rate_limit

このタスクタイプのレート制限を設定するには、(与えられた時間内に実行できるタスクの 数を制限しますフレーム)。

レート制限値に「/ S」、「/ M」又は「/ H」 付加することによって、秒、分または時間で指定することができます。タスクは、指定した時間枠に均等に分散されます( )。

例:「100/m」(100タスク分)。これにより、同じワーカーインスタンス上で2つのタスクを開始するまでの間に、最低でも の遅延が600msに強制されます。

あなたは毎秒1つのクエリにそれを制限したいのであれば、これを試してみてください。

@shared_task(rate_limit='1/s') 
def query_api_multiple(values): 
    ... 
関連する問題