簡體   English   中英

運行更多任務的 Celery 任務

[英]Celery task that runs more tasks

我正在使用 celerybeat 啟動一項主要任務,該任務啟動了許多次要任務。 我已經寫好了這兩個任務。

有沒有辦法輕松做到這一點? Celery 是否允許從任務中運行任務?

我的例子:

@task
def compute(users=None):
    if users is None:
        users = User.objects.all()

    tasks = []
    for user in users:
        tasks.append(compute_for_user.subtask((user.id,)))

    job = TaskSet(tasks)
    job.apply_async() # raises a IOError: Socket closed

@task
def compute_for_user(user_id):
    #do some stuff

從 celerybeat 調用compute ,但在嘗試運行apply_async時會導致 IOError。 有任何想法嗎?

要回答您的開場問題:從 2.0 版開始,Celery 提供了一種從其他任務開始任務的簡單方法。 您所說的“次要任務”就是所謂的“子任務”。 請參閱Sets of tasks、Subtasks 和 Callbacks的文檔,@Paperino 很樂意鏈接到這些文檔。

對於 3.0 版,Celery 更改為使用來處理這種和其他類型的行為。

您的代碼表明您已經熟悉此接口。 您的實際問題似乎是,“當我嘗試運行我的一組子任務時,為什么會出現 'Socket Closed' IOError ?” 我認為沒有人可以回答這個問題,因為您沒有提供有關您的程序的足夠信息。 您的摘錄不能按原樣運行,因此我們無法自行檢查您遇到的問題。 請發布隨IOError提供的堆棧跟蹤,如果運氣好的話,可以幫助您解決崩潰問題的人會出現。

並且由於版本 3.0 'TaskSet' 不再是術語......組,鏈和和弦作為一種特殊類型的子任務是新事物,請參閱http://docs.celeryproject.org/en/3.1/whatsnew-3.0 .html#group-chord-chain-are-now-subtasks

你可以使用這樣的東西(支持 3.0 )

g = group(compute_for_user.s(user.id) for user in users)
g.apply_async()

對於提到的 IOError,雖然這里的信息不足以說明是什么原因造成的,但我的猜測是你試圖在任務 function 內部建立連接,所以每當調用任務時,都會建立一個新的連接。 如果任務被調用千次,就會有千次連接。 這將淹沒系統套接字管理器並且 IOError 是它的抱怨。

暫無
暫無

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

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