99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Bamboo-pipeline:Python高效流程編排引擎

科技綠洲 ? 來源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-10-31 16:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Bamboo-pipeline 是藍(lán)鯨智云旗下SaaS標(biāo)準(zhǔn)運(yùn)維的流程編排引擎。其具備以下特點(diǎn):

  1. 多種流程模式 :支持串行、并行,支持子流程,可以根據(jù)全局參數(shù)自動(dòng)選擇分支執(zhí)行,節(jié)點(diǎn)失敗處理機(jī)制可配置。
  2. 參數(shù)引擎 :支持參數(shù)共享,支持參數(shù)替換。
  3. 可交互的任務(wù)執(zhí)行 :任務(wù)執(zhí)行中可以隨時(shí)暫停、繼續(xù)、撤銷,節(jié)點(diǎn)失敗后可以重試、跳過。

1.準(zhǔn)備

開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒有,可以訪問這篇文章:超詳細(xì)Python安裝指南 進(jìn)行安裝。

(可選1) 如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda:Python數(shù)據(jù)分析與挖掘好幫手—Anaconda,它內(nèi)置了Python和pip.

(可選2) 此外,推薦大家用VSCode編輯器,它有許多的優(yōu)點(diǎn):Python 編程的最好搭檔—VSCode 詳細(xì)指南。

請(qǐng)選擇以下任一種方式輸入命令安裝依賴

  1. Windows 環(huán)境 打開 Cmd (開始-運(yùn)行-CMD)。
  2. MacOS 環(huán)境 打開 Terminal (command+空格輸入Terminal)。
  3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install bamboo-engine
pip install bamboo-pipeline
pip install django
pip install celery

2. 項(xiàng)目初始化

(選項(xiàng)一:無Django項(xiàng)目) 如果你沒有任何的現(xiàn)成Django項(xiàng)目,請(qǐng)按下面的流程初始化

由于 ** bamboo-pipeline ** 運(yùn)行時(shí)基于 Django 實(shí)現(xiàn),所以需要新建一個(gè) Django 項(xiàng)目:

django-admin startproject easy_pipeline
cd easy_pipeline

在 ** easy_pipeline.settings.py ** 下添加如下配置:

from pipeline.eri.celery.queues import *
from celery import Celery

app = Celery("proj")

app.config_from_object("django.conf:settings")

INSTALLED_APPS = [
    ...
    "pipeline",
    "pipeline.engine",
    "pipeline.component_framework",
    "pipeline.eri",
    ...
]

在 ** easy_pipeline **目錄下初始化數(shù)據(jù)庫:

python manage.py migrate

(選項(xiàng)二:有Django項(xiàng)目需要使用流程引擎) 如果你有現(xiàn)成的PipeLine項(xiàng)目需要使用此流程引擎,請(qǐng)?jiān)陧?xiàng)目的** settings.py **下添加如下配置:

from pipeline.eri.celery.queues import *
from celery import Celery

app = Celery("proj")

app.config_from_object("django.conf:settings")

INSTALLED_APPS = [
    ...
    "pipeline",
    "pipeline.engine",
    "pipeline.component_framework",
    "pipeline.eri",
    ...
]

然后重新執(zhí)行migrate,生成pipeline相關(guān)的流程模型:

python manage.py migrate

migrate 執(zhí)行完畢后會(huì)如下圖所示:

圖片

由于是在原有項(xiàng)目上使用流程引擎,可能會(huì)遇到一些版本不匹配的問題,如果遇到報(bào)錯(cuò),請(qǐng)排查解決或到藍(lán)鯨官網(wǎng)上進(jìn)行詢問。

3. 簡(jiǎn)單的流程例子

首先在項(xiàng)目目錄下啟動(dòng) celery worker:

python manage.py celery worker -Q er_execute,er_schedule --pool=solo -l info

啟動(dòng)成功類似下圖所示:

圖片

(注意) 如果你是在你的原有Django項(xiàng)目上做改造,它并不一定能夠順利地啟動(dòng)成功,這是因?yàn)镻ipeline使用了 Django 2.2.24,會(huì)存在許多版本不兼容的情況。如果遇到報(bào)錯(cuò),請(qǐng)排查解決或到藍(lán)鯨官網(wǎng)上進(jìn)行詢問。

在下面的例子中,我們將會(huì)創(chuàng)建并執(zhí)行一個(gè)簡(jiǎn)單的流程:

圖片

3.1 創(chuàng)建流程APP

在 bamboo_pipeline 中,一個(gè)流程由多個(gè)組件組成,官方推薦使用APP統(tǒng)一管控組件:

python manage.py create_plugins_app big_calculator

該命令會(huì)在 Django 工程根目錄下生成擁有以下目錄結(jié)構(gòu)的 APP:

big_calculator
├── __init__.py
├── components
│   ├── __init__.py
│   └── collections
│   ├── __init__.py
│   └── plugins.py
├── migrations
│   └── __init__.py
└── static
    └── big_calculator
        └── plugins.js

別忘了把新創(chuàng)建的這個(gè)插件添加到 Django 配置的 **INSTALLED_APPS **中:

INSTALLED_APPS = (
    ...
    'big_calculator',
    ...
)

3.2 編寫流程的Service原子

組件服務(wù) ** Service是組件的核心,Service ** 定義了組件被調(diào)用時(shí)執(zhí)行的邏輯,下面讓我們實(shí)現(xiàn)一個(gè)計(jì)算傳入的參數(shù)n的階乘,并把結(jié)果寫到輸出中的 ** Service ** ,在 **big_calculator/components/collections/plugins.py ** 中輸入以下代碼:

import math
from pipeline.core.flow.activity import Service


class FactorialCalculateService(Service):

    def execute(self, data, parent_data):
        """
        組件被調(diào)用時(shí)的執(zhí)行邏輯
        :param data: 當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)對(duì)象
        :param parent_data: 該節(jié)點(diǎn)所屬流程的數(shù)據(jù)對(duì)象
        :return:
        """
        n = data.get_one_of_inputs('n')
        if not isinstance(n, int):
            data.outputs.ex_data = 'n must be a integer!'
            return False

        data.outputs.factorial_of_n = math.factorial(n)
        return True

    def inputs_format(self):
        """
        組件所需的輸入字段,每個(gè)字段都包含字段名、字段鍵、字段類型及是否必填的說明。
        :return:必須返回一個(gè) InputItem 的數(shù)組,返回的這些信息能夠用于確認(rèn)該組件需要獲取什么樣的輸入數(shù)據(jù)。
        """
        return [
            Service.InputItem(name='integer n', key='n', type='int', required=True)
        ]

    def outputs_format(self):
        """
        組件執(zhí)行成功時(shí)輸出的字段,每個(gè)字段都包含字段名、字段鍵及字段類型的說明
        :return: 必須返回一個(gè) OutputItem 的數(shù)組, 便于在流程上下文或后續(xù)節(jié)點(diǎn)中進(jìn)行引用
        """
        return [
            Service.OutputItem(name='factorial of n', key='factorial_of_n', type='int')
        ]

首先我們繼承了 ** Service基類,并實(shí)現(xiàn)了execute() ** 和 **outputs_format() ** 這兩個(gè)方法,他們的作用如下:

  1. execute :組件被調(diào)用時(shí)執(zhí)行的邏輯。接收 data 和 parent_data 兩個(gè)參數(shù)。
    其中,data 是當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)對(duì)象,這個(gè)數(shù)據(jù)對(duì)象存儲(chǔ)了用戶傳遞給當(dāng)前節(jié)點(diǎn)的參數(shù)的值以及當(dāng)前節(jié)點(diǎn)輸出的值。parent_data 則是該節(jié)點(diǎn)所屬流程的數(shù)據(jù)對(duì)象,通常會(huì)將一些全局使用的常量存儲(chǔ)在該對(duì)象中,如當(dāng)前流程的執(zhí)行者、流程的開始時(shí)間等。
  2. outputs_format :組件執(zhí)行成功時(shí)輸出的字段,每個(gè)字段都包含字段名、字段鍵及字段類型的說明。這個(gè)方法必須返回一個(gè) OutputItem 的數(shù)組,返回的這些信息能夠用于確認(rèn)某個(gè)組件在執(zhí)行成功時(shí)輸出的數(shù)據(jù),便于在流程上下文或后續(xù)節(jié)點(diǎn)中進(jìn)行引用。
  3. inputs_format :組件所需的輸入字段,每個(gè)字段都包含字段名、字段鍵、字段類型及是否必填的說明。這個(gè)方法必須返回一個(gè) InputItem 的數(shù)組,返回的這些信息能夠用于確認(rèn)某個(gè)組件需要獲取什么樣的輸入數(shù)據(jù)。

下面我們來看一下 **execute() **方法內(nèi)部執(zhí)行的邏輯,首先我們嘗試從當(dāng)前節(jié)點(diǎn)數(shù)據(jù)對(duì)象的輸出中獲取輸入?yún)?shù)n,如果獲取到的參數(shù)不是一個(gè) int 實(shí)例,那么我們會(huì)將異常信息寫入到當(dāng)前節(jié)點(diǎn)輸出的 **ex_data **字段中, 這個(gè)字段是引擎內(nèi)部的保留字段,節(jié)點(diǎn)執(zhí)行失敗時(shí)產(chǎn)生的異常信息都應(yīng)該寫入到該字段中 。隨后我們返回 ** False ** 代表組件本次執(zhí)行失敗,隨后節(jié)點(diǎn)會(huì)進(jìn)入失敗狀態(tài):

n = data.get_one_of_inputs('n')
if not isinstance(n, int):
    data.outputs.ex_data = 'n must be a integer!'
    return False

若獲取到的 n 是一個(gè)正常的 int,我們就調(diào)用 **math.factorial() **函數(shù)來計(jì)算 n 的階乘,計(jì)算完成后,我們會(huì)將結(jié)果寫入到輸出的 factorial_of_n 字段中,以供流程中的其他節(jié)點(diǎn)使用:

data.outputs.factorial_of_n = math.factorial(n)
return True

3.3 編寫流程組件,綁定Service原子

完成 Service 的編寫后,我們需要將其與一個(gè) Component 綁定起來,才能夠注冊(cè)到組件庫中,在**big_calculatorcomponents__init__.py **文件下添加如下的代碼:

import logging
from pipeline.component_framework.component import Component
from big_calculator.components.collections.plugins import FactorialCalculateService

logger = logging.getLogger('celery')


class FactorialCalculateComponent(Component):
    name = 'FactorialCalculateComponent'
    code = 'fac_cal_comp'
    bound_service = FactorialCalculateService

我們定義了一個(gè)繼承自基類 **Component **的類 FactorialCalculateComponent ,他擁有以下屬性:

1.name:組件名。
2.code:組件代碼,這個(gè)代碼必須是全局唯一的。
3.bound_service:與該組件綁定的 Service。

這樣一來,我們就完成了一個(gè)流程原子的開發(fā)。

3.4 生成流程,測(cè)試剛編寫的組件

在 big_calculatortest.py 寫入以下內(nèi)容,生成一個(gè)流程,測(cè)試剛剛編寫的組件:

# Python 實(shí)用寶典
# 2021/06/20

import time

from bamboo_engine.builder import *
from big_calculator.components import FactorialCalculateComponent
from pipeline.eri.runtime import BambooDjangoRuntime
from bamboo_engine import api
from bamboo_engine import builder


def bamboo_playground():
    """
    測(cè)試流程引擎
    """
    # 使用 builder 構(gòu)造出流程描述結(jié)構(gòu)
    start = EmptyStartEvent()
    # 這里使用 我們剛創(chuàng)建好的n階乘組件
    act = ServiceActivity(component_code=FactorialCalculateComponent.code)
    # 傳入?yún)?shù)
    act.component.inputs.n = Var(type=Var.PLAIN, value=4)
    end = EmptyEndEvent()

    start.extend(act).extend(end)

    pipeline = builder.build_tree(start)
    api.run_pipeline(runtime=BambooDjangoRuntime(), pipeline=pipeline)

    # 等待 1s 后獲取流程執(zhí)行結(jié)果
    time.sleep(1)

    result = api.get_execution_data_outputs(BambooDjangoRuntime(), act.id).data

    print(result)

隨后,在命令行輸入:

python manage.py shell

打開 django console, 輸入以下命令,執(zhí)行此流程:

from big_calculator.test import bamboo_playground
bamboo_playground()

流程運(yùn)行完后,獲取節(jié)點(diǎn)的執(zhí)行結(jié)果,可以看到,該節(jié)點(diǎn)輸出了 factorial_of_n,并且值為 24(4 * 3 * 2 *1),這正是我們需要的效果:

{'_loop': 0, '_result': True, 'factorial_of_n': 24}

恭喜你,你已經(jīng)成功的創(chuàng)建了一個(gè)流程并把它運(yùn)行起來了!在這期間你可能會(huì)遇到不少的坑,建議嘗試先自行解決,如果實(shí)在無法解決,可以前往 標(biāo)準(zhǔn)運(yùn)維 倉庫提 issues,或者前往藍(lán)鯨智云官網(wǎng)提問。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • WINDOWS
    +關(guān)注

    關(guān)注

    4

    文章

    3612

    瀏覽量

    91363
  • 參數(shù)
    +關(guān)注

    關(guān)注

    11

    文章

    1867

    瀏覽量

    33057
  • 編輯器
    +關(guān)注

    關(guān)注

    1

    文章

    822

    瀏覽量

    32000
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

    86672
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Python中的流程控制

    流程控制無非就是if else之類的控制語句,今天我們來看一下Python中的流程控制會(huì)有什么不太一樣的地方。
    發(fā)表于 06-28 08:54

    python基礎(chǔ)語法及流程控制

    爬蟲復(fù)習(xí)1.python基礎(chǔ)python基礎(chǔ)語法 流程控制 函數(shù)封裝2.防爬措施整體防爬User-AgentrefererIP代理池Cookie代理池 各自防爬數(shù)據(jù)內(nèi)部動(dòng)態(tài)加載網(wǎng)頁設(shè)置有干擾項(xiàng)標(biāo)簽
    發(fā)表于 08-31 07:41

    什么是Python中的流程控制?

    什么是Python中的流程控制?
    發(fā)表于 10-09 07:24

    Pipeline ADCs Come of Age

    Pipeline ADCs Come of Age Abstract: In the mid 1970s, a new data converter architecture
    發(fā)表于 04-16 16:21 ?1243次閱讀
    <b class='flag-5'>Pipeline</b> ADCs Come of Age

    Pipeline ADCs Come of Age

    and mixed-signal community, called pipeline ADCs. The following article takes the knowledge of advantages and disadvantages of the pipeline
    發(fā)表于 04-25 10:22 ?1154次閱讀
    <b class='flag-5'>Pipeline</b> ADCs Come of Age

    LCD漢字編排軟件

    LCD漢字編排軟件LCD漢字編排軟件LCD漢字編排軟件LCD漢字編排軟件
    發(fā)表于 12-28 14:31 ?7次下載

    python爬蟲入門教程之python爬蟲視頻教程分布式爬蟲打造搜索引擎

    本文檔的主要內(nèi)容詳細(xì)介紹的是python爬蟲入門教程之python爬蟲視頻教程分布式爬蟲打造搜索引擎
    發(fā)表于 08-28 15:32 ?30次下載

    Vivado綜合引擎的增量綜合流程

    從 Vivado 2019.1 版本開始,Vivado 綜合引擎就已經(jīng)可以支持增量流程了。這使用戶能夠在設(shè)計(jì)變化較小時(shí)減少總的綜合運(yùn)行時(shí)間。
    發(fā)表于 07-21 11:02 ?1931次閱讀

    什么是流程/規(guī)則編排

    以上兩種基本代表了傳統(tǒng)的編排思想,在簡(jiǎn)單的例子下,看起來也是非常直觀,但,當(dāng)變動(dòng)發(fā)生時(shí),尤其是需要靈活調(diào)整的場(chǎng)景,他們的表現(xiàn)又如何呢?
    的頭像 發(fā)表于 09-21 10:04 ?2289次閱讀

    Python一鍵轉(zhuǎn)化代碼為流程

    而今天我們要介紹的項(xiàng)目,就是基于Python和Graphviz開發(fā)的,能將源代碼轉(zhuǎn)化為流程圖的工具:pycallgraph。
    的頭像 發(fā)表于 02-24 11:19 ?4879次閱讀
    <b class='flag-5'>Python</b>一鍵轉(zhuǎn)化代碼為<b class='flag-5'>流程</b>圖

    一圖讀懂CodeArts Pipeline全新升級(jí),5大特性使能企業(yè)研發(fā)治理

    2023 年2月27日,華為云正式發(fā)布流水線服務(wù) CodeArts Pipeline ,旨在提升編排體驗(yàn),開放插件平臺(tái),并提供標(biāo)準(zhǔn)化的DevOps企業(yè)治理模型,將華為公司內(nèi)的優(yōu)秀研發(fā)實(shí)踐賦能給伙伴
    的頭像 發(fā)表于 03-25 07:50 ?1022次閱讀
    一圖讀懂CodeArts <b class='flag-5'>Pipeline</b>全新升級(jí),5大特性使能企業(yè)研發(fā)治理

    開箱即用!教你如何正確使用華為云CodeArts Pipeline!

    軟件持續(xù)交付流水線是一個(gè)可視化的自動(dòng)化任務(wù)編排調(diào)度平臺(tái),串聯(lián)編譯構(gòu)建、代碼檢查、自動(dòng)化測(cè)試、部署發(fā)布等任務(wù),承載軟件從代碼提交到發(fā)布上線全自動(dòng)化流程。一次配置后即可重復(fù)觸發(fā)執(zhí)行,避免頻繁低效
    的頭像 發(fā)表于 08-30 11:20 ?1537次閱讀
    開箱即用!教你如何正確使用華為云CodeArts <b class='flag-5'>Pipeline</b>!

    Python 如何一鍵轉(zhuǎn)化代碼為流程

    Graphviz是一個(gè)可以對(duì)圖進(jìn)行自動(dòng)布局的繪圖工具,由貝爾實(shí)驗(yàn)室開源。我們?cè)谏洗?Python 快速繪制畫出漂亮的系統(tǒng)架構(gòu)圖 提到的diagrams,其內(nèi)部的編排邏輯就用到了這個(gè)開源工具包。 而今
    的頭像 發(fā)表于 11-01 10:39 ?3122次閱讀
    <b class='flag-5'>Python</b> 如何一鍵轉(zhuǎn)化代碼為<b class='flag-5'>流程</b>圖

    什么是pipeline?Go中構(gòu)建流數(shù)據(jù)pipeline的技術(shù)

    本文介紹了在 Go 中構(gòu)建流數(shù)據(jù)pipeline的技術(shù)。 處理此類pipeline中的故障很棘手,因?yàn)?b class='flag-5'>pipeline中的每個(gè)階段可能會(huì)阻止嘗試向下游發(fā)送值,并且下游階段可能不再關(guān)心傳入的數(shù)據(jù)。
    的頭像 發(fā)表于 03-11 10:16 ?1097次閱讀

    行云流水線 滿足你對(duì)工作流編排的一切幻想~skr

    流水線模型 眾所周知,DevOps流水線(DevOps pipeline)的本質(zhì)是實(shí)現(xiàn)自動(dòng)化工作流程,用于支持軟件開發(fā)、測(cè)試和部署的連續(xù)集成、交付和部署(CI/CD)實(shí)踐。它是DevOps方法論
    的頭像 發(fā)表于 08-05 13:42 ?541次閱讀