celery 重複執行同乙個task

2021-08-27 20:54:34 字數 2326 閱讀 4894

今天用celery 執行 task的時候碰到了 重複執行的情況,而且是重複執行了8次….(電腦是8核的)

谷歌了一下,celery 在執行task時有個機制,就是任務時長超過了 visibility_timeout 時還沒執行完,就會指定其他worker重新開始task,預設的時長是一小時.

但是我這個肯定沒1小時,怎麼還是會重複執行,而且是8次,

# task**

import json

import paho.mqtt.subscribe as subscribe

from asgiref.sync import async_to_sync

from channels.layers import get_channel_layer

from celery import task

channel_layer = get_channel_layer()

defon_message

(client, userdata, msg):

# if msg.topic == "result":

payload = json.loads(msg.payload)

print(payload)

group_name = payload['group_name']

async_to_sync(channel_layer.group_send)(group_name, )

@task

deflisten

(): subscribe.callback(callback=on_message, topics='result')

subscribe是paho-mqtt庫的函式,是個阻塞函式,直到監聽到result主題的資訊.

然後就很尷尬,後來找到celery-once這個庫,解決了重複執行task的問題 github位址

具體步驟與解析在git上有詳細介紹,這裡就簡單說下,我的修改

#demo/settings

from celery import celery

celery = celery('mytest.task', broker='redis:')

celery.conf.once =

}

# demo/celery

# 這段**在celery官方文件中有 直接複製過來即可

from __future__ import absolute_import

import os

from celery import celery

from django.conf import settings

os.environ.setdefault('django_settings_module', 'whthas_home.settings')

defdebug_task

(self):

print('request: '.format(self.request))

#demo/__init__.py

# mytest/task

import json

import paho.mqtt.subscribe as subscribe

from asgiref.sync import async_to_sync

from channels.layers import get_channel_layer

from celery_once import queueonce

# 這裡匯入setting中的celery物件 如果直接用普通的celery.task 會報找不到task的錯

from ******demo.settings import celery

channel_layer = get_channel_layer()

defon_message

(client, userdata, msg):

# if msg.topic == "result":

payload = json.loads(msg.payload)

print(payload)

group_name = payload['group_name']

async_to_sync(channel_layer.group_send)(group_name, )

@celery.task(base=queueonce, once=)

deflisten

(): subscribe.callback(callback=on_message, topics='result')

然後就正常了,不會重複執行任務了

iOS 每隔一段時間,反覆執行同乙個任務

我們有時候會有這樣的需求,當程式處於執行狀態,每隔幾秒給伺服器傳送一次請求。這時我們可以這樣處理 uilocalnotification localnotification uilocalnotification alloc init 可以用該語句檢視當前執行緒 nslog 當前執行緒 nsthre...

如何使電腦不會重複啟動同乙個程序

讓程式不能被多次執行 問題 1 因為守護程序是長時間執行而不退出,因此.a.out執行一次就有乙個程序,執行多次就有多個程序。2 這樣並不是我們想要的。我們守護程序一般都是伺服器,伺服器程式只要執行乙個就夠了,多次同時執行並沒有意義甚至會帶來錯誤。3 因此我們希望我們的程式具有乙個單例執行的功能。意...

tomcat執行多個專案同乙個埠與不同埠的設定

一 首先打包專案 這裡採用eclipse開發工具,選中專案右擊,點選 export 進入 選擇web下的 war file 點選next 在這裡可能有坑,新裝的eclipse沒有 web資料夾 work with 輸入 juno 翻到最下面點開 選擇以下幾項 回歸正題 選擇war file 點選 第...