Chapter 05 命令行下的执行器 —— gf_workflow

girlfriend可以运行在任何支持python的环境中,您可以在web、GUI或者命令行程序中引用girlfriend。

但通常来说,运用的最多的环境还是命令行,girlfriend提供了gf_workflow工具专门在命令行执行工作流任务。

工作流的定义和加载

gf_workflow选择一个python定义的模块为执行目标,模块可以是单个python文件的形式,也可以注册在entry_point之中,还可以是PYTHONPATH下某个可以import的模块名称。

一个gf_workflow执行模块的示例:

# coding: utf-8

"""
Docs goes here
"""

from argparse import ArgumentParser
from girlfriend.workflow.gfworkflow import Job
from girlfriend.workflow.protocol import Env
from girlfriend.plugin.orm import SQL
from girlfriend.data.table import TableWrapper

# 命令行解析器,在这里可以定义工作流自己需要的参数
cmd_parser = ArgumentParser(description=__doc__.decode("utf-8"))
cmd_parser.add_argument("--table", "-t", dest="option",
                        default="user", action="store", help="")


# 日志设置项
logger = None # 可以指定一个字符串表示的日志文件路径,也可以是具体的Logger对象,当直接使用字符串路径时,默认将使用日期rotate策略。
logger_level = "info" # 默认输出的日志级别


def _test_env_args(options):
    return {}


def _test_env_config(options):
    return {
        "db_hehe": {
            "connect_url": "sqlite:////Users/chihongze/gftest/gftest.db"
        }
    }


def _pro_env_args(options):
    return {}


_pro_env_config = {
    "db_hehe": {
        "connect_url": "sqlite:////Users/chihongze/hehe/hehe.db"
    }
}

# 支持的运行环境列表,不同的运行环境支持不同的配置和参数,比如测试环境和正式环境访问的数据源有所区别。
env = (
    Env("test", _test_env_args, _test_env_config),
    Env("pro", _pro_env_args, _pro_env_config),
)

# 工作流定义,可以是一个返回工作流单元序列的函数也可以直接是工作流序列,取决于工作流是否要基于命令行参数而变化。
def workflow(options):
    work_units = (
        # orm_query
        Job(
            name="orm_query",
            plugin="orm_query",
            args=[
                SQL(
                    engine_name="hehe",
                    variable_name="table",
                    sql="select * from :table_name",
                    params={"table_name": options.table}, # 这里直接使用了命令行参数
                    row_handler=None,
                    result_wrapper=TableWrapper(
                        "table_name",
                        titles=["id", "编号", "name", "姓名", "clazz", "班级"]
                    )
                ),
            ]
        ),
        # print_table
        Job(
            name="print_table",
            plugin="print_table",
            args=[
                "$table"
            ]
        ),

    )

    return work_units

通常我们不必完整的去从头到尾编写一个工作流模块,直接使用gf_gen工具就可以生成工作流模板,有时甚至不需要写任何代码。

多重环境的支持

很多时候,我们相同逻辑的应用,但是在不同的环境中执行会使用不同的配置,如上述实例代码,gf_workflow对运行环境提供了完整的支持。

通过-e参数可以指定不同的运行环境。

gf_workflow -m workflow.py -e test

运行模式

gf_workflow支持三种运行模式:

  • once: 只执行一次就退出,也是默认的运行模式
  • forever: 将工作流陷入一个无限循环中执行。适合于某些消息驱动的任务,比如一个消息队列的Consumer,处理完一个消息再处理另一个。
  • interval: 间隔执行,也是将工作流至于一个无限循环中,只不过每次循环中间会间隔一段时间再执行。

通过-r或者--run-mode参数来指定运行模式:

gf_workflow -m workflow.py -r once
gf_workflow -m workflow.py -r forever
gf_workflow -m workflow.py -r interval:100s

interval:后面要跟时间,时间要带单位,支持以下单位:

  • s - 秒
  • m - 分
  • h - 时
  • d - 天

results matching ""

    No results matching ""