V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  lolizeppelin  ›  全部回复第 47 页 / 共 49 页
回复总数  974
1 ... 39  40  41  42  43  44  45  46  47  48 ... 49  
2017-09-19 00:40:33 +08:00
回复了 xx0223 创建的主题 职场话题 天... 运维行情这么差?? 这样的技术上海都混不到饭吃..
搭个车 我这水平 没文凭 35 能换什么工作

http://www.lolizeppelin.com/

https://github.com/lolizeppelin/
2017-09-16 22:40:52 +08:00
回复了 rogwan 创建的主题 Python zipfile 解压文件包中,有文件夹是中文名,就出错
看源码 一个一个文件解压
找的是 1 年运维经验 3 年开发经验的吧
2017-09-08 14:36:14 +08:00
回复了 lolizeppelin 创建的主题 Python taskflow 使用指南
2017-09-07 11:15:06 +08:00
回复了 lolizeppelin 创建的主题 Python taskflow 使用指南
好别扭....有点文字问题都不能修正....不想发了....
2017-09-07 11:09:07 +08:00
回复了 lolizeppelin 创建的主题 Python taskflow 使用指南
原来超过一定时间不能编辑的....

2. Executor

前面说了,Engine 会通过 Executor 执行任务,因为如果 Engine 直接执行任务的话,整个状态机的循环会受到正在执行的任务的影响,所以包了一层 Executor 来执行具体的任务(当然具体代码里对 Executor 的应用会更复杂一点,为了扩展和异常处理包了 3 层)

在 taskflow 的源代码中 Executor 是通过 futurist 库来实现的,而 futurist 又是基于 futures 的,这个库内部实现还是比较复杂的,如果没用过对应库的,建议直接参考我简化的[futurist]( https://github.com/lolizeppelin/simpleutil/blob/master/simpleutil/utils/futurist.py),因为是用 eventlet 实现的,所以需要熟悉 eventlet.

具体的任务代码(比如备份数据库什么的)在一般情况下可以不处理异常,因为执行任务的代码通过 except Exception 捕获了任务的所有异常.

特殊异常就是 CancelledError,这个异常是调度到已经取消任务时由 futurist 抛出,在读代码的时候需注意下这个的特殊处理

3. Scheduler

这个没什么好说的,Executor 的封装的最上层,最后执行会落实到具体的 Executor 上

4. storage

这个是存储接口,后面说到 flow 的时候会详细讲到,storage 的初始化在 Engine 中,一个功能是数据存储的接口,一个功能是作为 flow 的外层封装

4. Runtime 与 machine

在看这个之前,如果你还不熟悉状态机,建议先拿前面说的 automaton 练练手,如果已经熟悉状态机但是还没看过 automaton 代码的,建议去看看 automaton 的代码

machine 就是 Engine 中循环的(automaton)状态机了,一个 engine 只运行一个状态机,初始化代码在 builder.MachineBuilder,MachineBuilder 又是在 Runtime 中调用生成 machine 的,我们先别管 Runtime,先理解一下 taskflow 的状态机

taskflow 状态机并不复杂,但还不熟悉 taskflow 的时候很容易被高懵.因为 taskflow 用到 networkx 这个图库,而状态机其实就是一个有向图,所以一开始看的时候,很容易以为 taskflow 的状态机会非常复杂要看懂图的相关代码才能搞明白,但实际情况是

taskflow 的状态机和图无关!因为 taskflow 状态机的状态很少不需要用图来解决状态循环

那么 taskflow 为什么要用到图库呢,在解决这个疑问前我们先抛开 taskflow,自己用状态机设计一个解决前面——"停服 备份数据库 升级数据库 升级应用 启动服务器" 的工作流

1. 首先定义停服状态和对应停服状态执行的代码
2. 定义停服成功的返回,失败的返回,定义进入停服状态的 event (这个是起始时间,event 就是 start )
3. 定义备份数据库状态对应备份执行代码
4. 定义进入备份状态的 event (前面的停服成功)
5. 定义备份成功和备份失败的返回,到目前还简单,备份失败大不了多备份几次直到成功,失败了整个状态机终止都可以影响不大
6. 定义升级数据库状态对应备份执行代码
7. 定义进入升级状态的 event (前面的备份成功)
8. 定义升级成功和备份失败的返回,这里开始坑了,升级失败要回滚了
9. 发现少了回滚升级失败的状态定义.....增加升级失败回滚失败的定义
......
回滚升级数据库失败....升级应用是失败...回滚升级应用是失败.....启动失败

设计下来你发现没几个步骤。要定义的状态就越来越多...这也就是状态机复杂以后和图有关的原因了

taskflow 非常巧妙的避免了复杂化状态机,taskflow 的设计的状态机可以简单的理解只处理 2 个状态就好

开始....找到任务-执行任务-找到任务....执行任务...终止

执行任务就是调用 Executor, 至于找下一个任务的工作,就是封装了图库的 flow 的工作了.这样设计状态机状态就很少,具体的状态可以看 MachineBuilder 的注释中有对应表格,对应状态目前粗看一下即可,知道哪个状态是找任务、哪个状态执行任务就可,有些状态涉要看了后面的 retry 相关才比较好理解,至于 flow,这个我们在后面说明

回头来看 Runtime,MachineBuilder 是由 Runtime 生成的,状态机的有些 callback 最终执行的 Runtime 中的函数,里面会有一些嵌套和封装, Scheduler 的封装就在 Runtime 中,Runtime 可以简单理解为状态机调用其它注入 Scheduler、storage 接口调用的中间件,Runtime 在整体理解 taskflow 的的时候可以不用细看

第一篇完...请看下一篇介绍 flow atom task retry
先 cd 进去不就行了
2017-09-02 14:26:47 +08:00
回复了 evil4ngl3 创建的主题 Python Python 项目安全疑问?
对于 1 非开发环境禁止 pip easy_setup.py 装包,自己的程序不仅要按照 setuptool 的标准写好 setp.py 文件, 也要制作对应 spec 文件用于生成 rpm 包,正式环境全部用 rpm 解决依赖, 没有依赖库的版本自己把依赖库做成 rpm,不要使用偏门的库,常规的库基本都够用了,常用 yum 源的 rpm 一般是可以保证安全的,其他 rpm 需要自己检查代码

对于 2 只要用的是常用的代码基本问题都不大不要用偏门的库,多读源代码
2017-09-02 14:17:53 +08:00
回复了 evil4ngl3 创建的主题 Python Python 项目安全疑问?
呵呵,前几天还有帖子开发 JJYY 公司要求所有库用 rpm 包的
2017-09-02 13:58:08 +08:00
回复了 dcyuhi 创建的主题 程序员 有没有简单易懂的讲 多线程,异步的书籍或者资料
自己写个多人聊天室 能广播,用上 select,自定义协议,处理分包粘包

写完就入门了
2017-09-02 13:56:00 +08:00
回复了 51300520 创建的主题 Python 不是说协程不用加锁吗?
谁和你说不用加锁的...
2017-08-31 13:33:26 +08:00
回复了 ouiki 创建的主题 Python [求助] subprocess 的 stdout 堵塞问题
还有 不要只顾 stdout 有些软件不标准
普通错误都往 stderr 里塞
2017-08-31 13:28:37 +08:00
回复了 ouiki 创建的主题 Python [求助] subprocess 的 stdout 堵塞问题
不要用 readline 老老实实 read
2017-08-24 17:22:07 +08:00
回复了 40huo 创建的主题 Python Python 多进程操作文件,文件锁好像并没有生效
直接 fork 不要用库试试
因为你的新数据是在这个快照上变动生成的
如果要删除快照 需要重新生成一份磁盘文件 快照基点回到初始化系统的上
2017-08-21 09:51:15 +08:00
回复了 saximi 创建的主题 Python 请教关于类装饰器的问题
哦理解错,我以为是类里面的装饰器 ,你这是装饰类的装饰器

这不很简单么第二个类装饰器可以预接参数成为实例,然后装饰类的时候是这个实例的 call 方法去套

第一个是相当于把这个装饰器类实例化,初始化参数就是一个类


装饰器就是套娃语法糖 func(func(func()))

自己套一下就知道了
2017-08-21 09:43:50 +08:00
回复了 saximi 创建的主题 Python 请教关于类装饰器的问题
去看描述器 看完再回来看你的问题
2017-08-19 20:23:08 +08:00
回复了 shaodamao 创建的主题 Python 萌新求助,关于 Python 装饰器
顺便说下 。上面那种写法用得少一点 属于先套函数参数再套函数的


一般写法是先套 fun
2017-08-19 20:14:04 +08:00
回复了 shaodamao 创建的主题 Python 萌新求助,关于 Python 装饰器
装饰器是单纯的套娃语法糖

具体看套的是什么


有的是闭包 有的是描述器


上面那个是闭包

套一层只能传不带参数的函数
套二层能传函数参数
套三层能传入预参数
0v0 不对 已经是长连接池了 只有一个目的地没这问题 233
1 ... 39  40  41  42  43  44  45  46  47  48 ... 49  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2541 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 35ms · UTC 01:52 · PVG 09:52 · LAX 18:52 · JFK 21:52
Developed with CodeLauncher
♥ Do have faith in what you're doing.