最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python基于celery實現(xiàn)異步任務(wù)周期任務(wù)定時任務(wù)

 更新時間:2019年12月30日 10:40:38   投稿:yaominghui  
這篇文章主要介紹了python基于celery實現(xiàn)異步任務(wù)周期任務(wù)定時任務(wù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

這篇文章主要介紹了python基于celery實現(xiàn)異步任務(wù)周期任務(wù)定時任務(wù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

hello, 小伙伴們, 好久不更新了,這一次帶來的是celery在python中的應(yīng)用以及設(shè)置異步任務(wù)周期任務(wù)和定時任務(wù)的步驟,希望能給入坑的你帶來些許幫助.

首先是對celery的介紹,Celery其實是一個專注于實時處理和調(diào)度任務(wù)的分布式任務(wù)隊列,同時提供操作和維護分布式系統(tǒng)所需要的全部數(shù)據(jù), 因此可以用它提供的接口快速實現(xiàn)并管理一個分布式的任務(wù)隊列,它本身不是任務(wù)隊列,它是封裝了操作常見任務(wù)隊列的各種操作, 可以使用它快速進行任務(wù)隊列的使用與管理.在Python中的組成部分是 1.用戶任務(wù) app 2.管道 broker 用于存儲任務(wù) 官方推薦的是 redis rabbitMQ / backend 用于存儲任務(wù)執(zhí)行結(jié)果的 3, 員工 worker 大致流程入下:

最左邊的是用戶, 用戶發(fā)起1個請求給服務(wù)器, 要服務(wù)器執(zhí)行10個任務(wù),將這10個任務(wù)分給10個調(diào)度器,即開啟10個線程進行任務(wù)處理,worker會一直監(jiān)聽調(diào)度器是否有任務(wù), 一旦發(fā)現(xiàn)有新的任務(wù), 就會立即執(zhí)行新任務(wù),一旦執(zhí)行完就會返回給調(diào)度器, 即backend, backend會將請求發(fā)送給服務(wù)器, 服務(wù)器將結(jié)果返回給用戶, 表現(xiàn)的結(jié)果就是,這10個任務(wù)同時完成,同時返回,,這就是Celery的整個工作流程, 其中的角色分別為,任務(wù)(app_work), 調(diào)度器(broker + backend), 將任務(wù)緩存的部分, 即將所有任務(wù)暫時存在的地方,相當(dāng)于生產(chǎn)者, 消費者(worker 可以指定數(shù)量, 即在創(chuàng)建worker命令的時候可以指定數(shù)量), 在worker拿到任務(wù)后,人就控制不了了, 除非把worker殺死, 不然肯定會執(zhí)行完.

也即 任務(wù)來了以后, 調(diào)度器(broker)去緩存任務(wù), worker去執(zhí)行任務(wù), 完成后返回backend,接著返回,

還有就是關(guān)于定時任務(wù)和周期任務(wù)在linux上為什么不用自身所帶著的去做,是因為linux周期定時任務(wù)是不可控的, 不好管理, 返回值保存也是個麻煩事, 而celery只要開啟著調(diào)度器, 就可以隨時把人物結(jié)果獲取到,即使用celery控制起來是非常方便的.

接下來就是實例代碼:

workers.py

from celery import Celery
import time
# 創(chuàng)建一個Celery實例, 就是用戶的應(yīng)用app 第一個參數(shù)是任務(wù)名稱, 可以隨意起 后面的就是配置的broker和backend
diaoduqi= Celery("mytask", broker="redis://127.0.0.1:6379", backend="redis:127.0.0.1:6379")
# 接下來是為應(yīng)用創(chuàng)建任務(wù) ab
@diaoduqi.task
def ab(a,b):
  time.sleep(15)
  return a+b

brokers.py

from worker import ab

# 將任務(wù)交給Celery的Worker執(zhí)行
res = ab.delay(2,4)

#返回任務(wù)ID
print(res.id)

backends.py

from celery.result import AsyncResult
from worker import diaoduqi

# 異步獲取任務(wù)返回值
async_task = AsyncResult(id="31ec65e8-3995-4ee1-b3a8-1528400afd5a",app=diaoduqi)

# 判斷異步任務(wù)是否執(zhí)行成功
if async_task.successful():
  #獲取異步任務(wù)的返回值
  result = async_task.get()
  print(result)
else:
  print("任務(wù)還未執(zhí)行完成")

為了方便,現(xiàn)在直接將三個文件代表的部分命名在文件名稱中.首先是啟動workers.py

啟動方式是依據(jù)系統(tǒng)的不同來啟動的, 對于linux下 celery worker -A workers -l INFO 也可以指定開啟的worker數(shù)量 即在后面添加的參數(shù)是 -c 5 表示指定5個worker 理論上指定的worker是無上限的,

在windows下需要安裝一個eventlet模塊進行運行, 不然不會運行成功 pip install eventlet 可以開啟線程 不指定數(shù)量是默認(rèn)6個worker, 理論上worker的數(shù)量可以開啟無限個,但是celery worker -A s1 -l INFO -P eventlet -c 5 使用eventlet 開啟5個worker 執(zhí)行

該命令后 處于就緒狀態(tài), 需要發(fā)布任務(wù), 即brokers.py進行任務(wù)發(fā)布, 方法是使用delay的方式執(zhí)行異步任務(wù), 返回了一個任務(wù)id, 接著去backends.py中取這個任務(wù)id, 去查詢?nèi)蝿?wù)是否完成,判定條件即任務(wù).successful 判斷是否執(zhí)行完, 上面就是celery異步執(zhí)行任務(wù)的用法與解釋

接下來就是celery在項目中的應(yīng)用

在實際項目中應(yīng)用celery是有一定規(guī)則的, 即目錄結(jié)構(gòu)應(yīng)該如下.

結(jié)構(gòu)說明 首先是創(chuàng)建一個CeleryTask的包,接著是在里面創(chuàng)建一個celery.py,必須是這個文件 關(guān)于重名的問題, 找尋模塊的順序是先從當(dāng)前目錄中去尋找, 根本找不到,接著是從內(nèi)置模塊中去找, 根本就找不到寫的這個celery這個文件,

celery.py

from celery import Celery
DDQ = Celery("DDQ",broker="redis://127.0.0.1:6379",backend="redis://127.0.0.1:6379",
       include=["CeleryTask.TaskOne","CeleryTask.TaskTwo"])

TaskOne.py

import time
from CeleryTask.celery import DDQ
@DDQ.task
def one1(a,b):
  # time.sleep(3)
  return a+b
@DDQ.task
def one2():
  time.sleep(2)
  return "one2"

taskTwo.py

import time
from CeleryTask.celery import DDQ
@DDQ.task
def two1():
  time.sleep(2)
  return "two1"
@DDQ.task
def two2():
  time.sleep(3)
  return "two2"

getR.py

from CeleryTask.TaskOne import one1 as one

# one.delay(10,10)
# two.delay(20,20)

# 定時任務(wù)我們不在使用delay這個方法了,delay是立即交給task 去執(zhí)行
# 現(xiàn)在我們使用apply_async定時執(zhí)行

# 首先我們要先給task一個執(zhí)行任務(wù)的時間
import datetime, time

# 獲取當(dāng)前時間 此時間為東八區(qū)時間
ctime = time.time()
# 將當(dāng)前的東八區(qū)時間改為 UTC時間 注意這里一定是UTC時間,沒有其他說法
utc_time = datetime.datetime.utcfromtimestamp(ctime)
# 為當(dāng)前時間增加 10 秒
add_time = datetime.timedelta(seconds=10)
action_time = utc_time + add_time

# action_time 就是當(dāng)前時間未來10秒之后的時間
# 現(xiàn)在我們使用apply_async定時執(zhí)行
res = one.apply_async(args=(6, 10), eta=action_time)
res = one.apply_async(args=(6, 10), eta=action_time)
res = one.apply_async(args=(6, 10), eta=action_time)
res = one.apply_async(args=(6, 10), eta=action_time)
res = one.apply_async(args=(6, 10), eta=action_time)
res = one.apply_async(args=(6, 10), eta=action_time)
print(res.id)
# 這樣原本延遲5秒執(zhí)行的One函數(shù)現(xiàn)在就要在10秒鐘以后執(zhí)行了

接著是在命令行cd到與CeleryTask同級目錄下, 使用命令 celery worker -A CeleryTask -l INFO -P eventlet -c 50 這樣 就開啟了worker 接著去 發(fā)布任務(wù), 在定時任務(wù)中不再使用delay這個方法了,

delay是立即交給ttask去執(zhí)行, 在這里使用 apply_async定時執(zhí)行 指的是調(diào)度的時候去定時執(zhí)行

需要設(shè)置的是UTC時間, 以及定時的時間(多長時間以后執(zhí)行) 之后使用 celery worker -A CeleryTask -l INFO -P eventlet -c 50 命令開啟worker, 之后運行 getR.py文件發(fā)布任務(wù), 可以看到在定義的時間以后執(zhí)行該任務(wù)

周期任務(wù)

周期任務(wù) 指的是在指定時間去執(zhí)行任務(wù) 需要導(dǎo)入的一個模塊有 crontab

文件結(jié)構(gòu)如下

結(jié)構(gòu)同定時任務(wù)差不多,只不過需要變動一下文件內(nèi)容 GetR文件已經(jīng)不需要了,可以刪除.

celery.py

from celery import Celery
from celery.schedules import crontab

DDQ = Celery("DDQ", broker="redis://127.0.0.1:6379", backend="redis://127.0.0.1:6379",
       include=["CeleryTask.TaskOne", "CeleryTask.TaskTwo"])

# 我要要對beat任務(wù)生產(chǎn)做一個配置,這個配置的意思就是每10秒執(zhí)行一次Celery_task.task_one任務(wù)參數(shù)是(10,10)
DDQ.conf.beat_schedule = {
  "each10s_task": {
    "task": "CeleryTask.TaskOne.one1",
    "schedule": 10, # 每10秒鐘執(zhí)行一次
    "args": (10, 10)
  },
  "each1m_task": {
    "task": "CeleryTask.TaskOne.one2",
    "schedule": crontab(minute=1) # 每1分鐘執(zhí)行一次 也可以替換成 60 即 "schedule": 60
  }
}

TaskOne.py

import time
from CeleryTask.celery import DDQ
@DDQ.task
def one1(a,b):
  # time.sleep(3)
  return a+b
@DDQ.task
def one2():
  time.sleep(2)
  return "one2"

taskTwo.py

import time
from CeleryTask.celery import DDQ
@DDQ.task
def two1():
  time.sleep(2)
  return "two1"
@DDQ.task
def two2():
  time.sleep(3)
  return "two2"

以上配置完成以后,這時候就不能直接創(chuàng)建worker了,因為要執(zhí)行周期任務(wù),需要首先有一個任務(wù)的生產(chǎn)方, 即 celery beat -A CeleryTask, 用來產(chǎn)生創(chuàng)建者, 接著是創(chuàng)建worker worker的創(chuàng)建命令還是原來的命令, 即 celery worker -A CeleryTask -l INFO -P eventlet -c 50 , 創(chuàng)建完worker之后, 每10秒就會由beat創(chuàng)建一個任務(wù)給 worker去執(zhí)行.至此, celery創(chuàng)建異步任務(wù), 周期任務(wù),定時任務(wù)完畢, 伙伴們自己拿去測試吧.

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python判斷直線和矩形是否相交的方法

    Python判斷直線和矩形是否相交的方法

    這篇文章主要介紹了Python判斷直線和矩形是否相交的方法,涉及Python坐標(biāo)系下的直線與矩形相關(guān)運算,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 基于Python執(zhí)行dos命令并獲取輸出的結(jié)果

    基于Python執(zhí)行dos命令并獲取輸出的結(jié)果

    這篇文章主要介紹了基于Python執(zhí)行dos命令并獲取輸出的結(jié)果,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Python中os模塊的簡單使用及重命名操作

    Python中os模塊的簡單使用及重命名操作

    這篇文章主要給大家介紹了關(guān)于Python中os模塊的簡單使用及重命名操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • python畫圖系列之個性化顯示x軸區(qū)段文字的實例

    python畫圖系列之個性化顯示x軸區(qū)段文字的實例

    今天小編就為大家分享一篇python畫圖系列之個性化顯示x軸區(qū)段文字的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Pytes正確的配置使用日志功能

    Pytes正確的配置使用日志功能

    在pytest自動化測試中,如果只是簡單的從應(yīng)用的角度來說,完全可以不去了解pytest中的顯示信息的部分以及原理,可以通過使用推薦的pytest.ini配置,從而可以做到相對來說比較通用的日志配置,這篇文章主要介紹了Pytes如何正確的配置使用日志功能,需要的朋友可以參考下
    2022-12-12
  • 淺析Python中正則表達式函數(shù)search()和match()的使用

    淺析Python中正則表達式函數(shù)search()和match()的使用

    在Python中,正則表達式是處理字符串的強大工具,search()和match()是Python標(biāo)準(zhǔn)庫中re模塊中兩個常用的正則表達式方法,本文將詳細講解這兩個方法的使用,需要的可以參考一下
    2023-08-08
  • python3中類的繼承以及self和super的區(qū)別詳解

    python3中類的繼承以及self和super的區(qū)別詳解

    今天小編就為大家分享一篇python3中類的繼承以及self和super的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python的控制結(jié)構(gòu)之For、While、If循環(huán)問題

    Python的控制結(jié)構(gòu)之For、While、If循環(huán)問題

    這篇文章主要介紹了Python的控制結(jié)構(gòu)之For、While、If循環(huán)問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 使用python腳本自動生成K8S-YAML的方法示例

    使用python腳本自動生成K8S-YAML的方法示例

    這篇文章主要介紹了使用python腳本自動生成K8S-YAML的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Python實現(xiàn)字典依據(jù)value排序

    Python實現(xiàn)字典依據(jù)value排序

    新華字典大家都使用過吧,那么使用python語言是如何實現(xiàn)字典排序的呢?下面跟著本教程一起學(xué)習(xí)Python實現(xiàn)字典依據(jù)value排序,需要的朋友參考下吧
    2016-02-02

最新評論

当阳市| 资兴市| 溧阳市| 惠安县| 高唐县| 揭西县| 常熟市| 寿阳县| 古丈县| 乌审旗| 昭平县| 宣威市| 车致| 永清县| 江安县| 重庆市| 格尔木市| 霍邱县| 星子县| 杭州市| 尉犁县| 措勤县| 黄龙县| 治县。| 昆明市| 百色市| 板桥市| 纳雍县| 丰顺县| 崇文区| 汽车| 攀枝花市| 丰宁| 资溪县| 施甸县| 镇平县| 喜德县| 察隅县| 尼勒克县| 泾阳县| 会理县|