今天用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 點選 第...