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 - 天