Skip to content

Commit e2bff0e

Browse files
author
Chenwe_i_lin
committed
add: on_stage
1 parent 8558a4c commit e2bff0e

2 files changed

Lines changed: 34 additions & 1 deletion

File tree

docs/.vuepress/config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ module.exports = {
5050
]
5151
},
5252
["/tutorial/subroutine", "协处理器"],
53-
['/tutorial/middleware', "中间件"]
53+
['/tutorial/middleware', "中间件"],
54+
['/tutorial/on_stage', "生命周期机制"]
5455
]
5556
}
5657
]

docs/tutorial/on_stage.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# 生命周期(Life Cycle)
2+
3+
有时候, 你可能会有在程序的各个不同阶段执行代码的需求:
4+
- 程序启动时, 向 Master 进程汇报并获取 Worker ID
5+
- 程序关闭时, 向 Master 进程汇报并释放自己的 Worker ID
6+
- 还有很多...
7+
8+
而我们也提供了相应的解决方案, 即我们接下来要讲的 `Mirai.on_stage` 方法
9+
10+
## 使用
11+
使用的方式非常简单, 只需要用该方法装饰一个函数(异步同步皆可):
12+
13+
``` python
14+
@app.on_stage("start")
15+
async def start_stage_subroutine(app: Mirai):
16+
...
17+
```
18+
19+
我们传入的是一个 阶段名称(Stage name), 你可以随便注册阶段名,
20+
但我们的 `run` 方法只会执行注册了这几个阶段的函数:
21+
- `"start"`: 在程序启动时执行, 最先被执行.
22+
- `"around"`: 在程序启动和被终止时执行(Ctrl-C), 执行优先级比 `start` 低, 但比 `end` 高.
23+
- `"end"`: 在程序被终止时执行(Ctrl-C), 执行优先级比 `start``ground` 都低.
24+
25+
## 与 Subroutine 的异同
26+
执行生命周期时, 主线程会被堵塞, 并且 `subroutine` 是在 `start``around` 执行完后和事件监听/广播协程一起运行的.
27+
28+
但相同的一处是, 无论是 `subroutine` 还是生命周期, 在他们执行前, `session_key` 就已经被激活,
29+
保证无论执行的是哪个, 其内部运行的事务都会顺利的执行
30+
31+
当然, 前提是你不要自己绊自己调用 `Mirai.release` 方法释放 `session_key`,
32+
虽然 `python-mirai` 会自动对其进行刷新, 但还是会对程序的稳定性产生影响的.

0 commit comments

Comments
 (0)