簡體   English   中英

Celery + Python:將耗時的任務排隊在另一個任務中

[英]Celery + Python: Queue time consuming tasks within another task

我想查詢包含很多項目(〜100)但不是一次全部的api(這很耗時)。 相反,我希望查詢之間有一些延遲。

我目前擁有的任務是異步執行的,並遍歷查詢,每次迭代后都等待一段時間:

@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而是對任務進行速率限制:

Task.rate_limit

設置此任務類型的速率限制(限制在給定時間范圍內可以運行的任務數量)。

可以通過在值后添加“ / s”,“ / m”或“ / h”來指定速率限制,以秒,分鍾或小時為單位。 任務將在指定的時間段內平均分配。

示例:“ 100 / m”(每分鍾一百個任務)。 這將在同一工作程序實例上啟動兩個任務之間強制執行至少600ms的延遲。

因此,如果您希望將其限制為每秒1個查詢,請嘗試以下操作:

@shared_task(rate_limit='1/s')
def query_api_multiple(values):
    ...

是的,如果您創建多個任務,那么它們可能會同時運行。

如果要限制每個時間段運行的任務數,可以使用芹菜對任務類型進行限制。 或者,如果您需要比芹菜提供的OOtB更多的靈活性,則可以使用redis之類的東西結合芹菜重試來實現限速模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM