簡體   English   中英

使用並發並發的 Celery 串行處理特定任務

[英]Serial processing of specific tasks using Celery with concurrency

我有一個 python/celery 設置:我有一個名為“task_queue”的隊列和多個 python 腳本,它們從不同的傳感器提供數據。 如果傳感器值從高變為低,則有一個芹菜工人從該隊列中讀取數據並向用戶發送警報。 工作線程有多個線程(我啟用了自動縮放參數)並且一切正常,直到一個傳感器決定一次發送多條消息。 那是我獲得競爭條件並可能向用戶發送多個警報的時候,因為在線程存儲它已經發送警報的信息之前,很少有其他線程也會發送它。

我有 n 個傳感器(n 可以超過 10000),並且應該按順序處理來自任何傳感器的消息。 所以理論上我可以有 n 個線程,但這會有點矯枉過正。 我正在尋找一種最簡單的方法來在 x 個線程(通常為 10 或 20 個)之間平均分配消息,因此每次我想增加 x(或減少)時,我都不必(重新)編寫路由函數並定義新隊列)。

那么是否有可能以某種方式標記源自同一傳感器的任務以串行方式執行(在調用延遲或 apply_async 時)? 或者我應該使用不同的隊列/工作器架構來實現這一目標嗎?

據我了解,您有一些任務可以同時運行,而特定任務則不能這樣做(此任務需要一次執行 1 個)。

沒有辦法(目前)設置特定任務隊列的並發性,所以我認為在您的情況下最好的方法是處理多個工作人員的問題。

假設您有以下隊列:

  • queue_1這里我們發送可以同時運行的任務
  • queue_2這里我們發送一次可以運行 1 個的任務。

您可以使用以下命令啟動 celery(如果您希望它們在同一台機器上)。

celery -A proj worker --loglevel=INFO --concurrency=10 -n worker1@%h -Q queue_1
celery -A proj worker --loglevel=INFO --concurrency=1 -n worker2@%h -Q queue_2

這將使具有並發性 10 的worker1處理所有可以同時運行的任務,而worker2一次worker2處理需要為 1 的任務。

這是一些文檔參考:https ://docs.celeryproject.org/en/stable/userguide/workers.html

注意:在這里您需要指定隊列運行的任務。 這可以在使用apply_async直接從裝飾器或其他方式調用時完成。

暫無
暫無

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

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