说明
通过这三者之间的搭配,可以更好的组织程序,特别是应对长周期运行的,需要弹性变化和复用的场景。
内容
1 Tips
- shell命令可以执行python程序。
python xxx.py
- python可以执行shell命令。
os.system('python xxx.py')
- 紧耦合与松耦合。规则集(容器)之内是紧耦合的,逻辑整合在对象之内;规则集之间是松耦合的。
- 通过argparse, 规则集可以通过简单的参数启动。【可配合遗传算法】
- 使用python的apscheduler执行定时任务比cron方便(不用去管权限什么的)
2 规则集(容器)的约定
- 1 数据有两个文件夹:input / output
- 1 input:用于存放待处理的左边数据
- 2 output:用于存放处理后的右边数据
- 2 元数据有两个文件夹:log / err
- 1 log: 存放运行时的日志,用于分析流程性能,连通性等
- 2 err: 存放失败时的数据,用于调试
每个容器的四个部件下面(I/O/L/E)都有一个二级目录,可以区分不同项目制程的内容。
3 主容器
主容器是可以执行宿主机docker命令的容器,通过命令启停容器。
主容器负责组织和调度各容器,完成某个特殊的业务需求。例如:从A库取数,对数据进行清洗,再对数据预处理,再对数据进行预测,再将结果回传这样的操作。在程序上,主容器就是FuncChain
主容器有一个比较重要的工作:为每部分工作建立文件夹,并为相应的文件夹启动并挂载容器,整个过程以数据结果的存放为导向。文件夹的命名按照一定规范用下滑线连接:
- 1 项目名称 project
- 2 制程编号 schema
- 3 流程名称 process
- 4 流程编号 0,1,2,3
- 5 分片编号 shard,0,1,2,3
例:
hello_md5xxxxxxxxxxxx_clean_0000_shard_0000
其中制程编号是包含了一系列参数设定的md5码,蕴含了最复杂的变化信息。shard是为了可以进行并发而做的编号。主容器要进行容器启动时会进行规划,如果在执行过程中发生了变化,那么主容器会在「da」时刻更新配置并重启容器。
4 容器的持久运行
4.1 While True
这可能是最土的持久运行了,但这样总归可以避免内外存来回倒数据浪费时间,例如模型数据的初始化。
4.2 使用SimpleAPI
使用Flask启动一个简单接口服务。
4.3 触发运行
服务主体本身是持续运行的,因此真正的入口是一个触发器。
触发可以是一次性的,也可以通过循环的任务无限运行。
5 数据的动态对齐(处理或删除)
对于每个p来说,需要不定期的维护自己的I/O。既要完成新的任务,也要清除无用的任务。以数据hash加上纳秒级时间戳
构成任务的唯一标志,作为数据集合元素。
输入集合,或者说左边集合记为Si;输出集合,或者说右边集合记为So。
- 1 待处理元素集合。 Si - So
- 2 带删除元素集合。 So - Si
6 效果与效率
在执行一个任务的时候,我们通常会有两方面的想法:
- 1 是否能通过更好的参数,达到更好的结果
- 2 是否可以利用更多的资源,更快的完成任务
遗传算法可以进行以上两方面的优化。