搜索
查找主题、作者或分类。
Node.js 20.3+:用 AbortSignal.any 合并超时与主动取消一个异步操作往往同时受两类取消条件约束:自身执行超时,以及进程收到的主动停止请求。与其让业务函数分别监听多个信号,可以在调用边界用 `AbortSignal.any()` 合并,再把单一 `signal` 向下传递。
**环境**:Node.js 20.3+;Linux、macOS 或 Windows;仅使用内置模块;项目使用 ESM。
创建 `cancel-demo.mjs`:
```js
import { setTimeout as sleep } from 'node:timers/promises';
async function runJob({ signal }) {
for (let step = 1; step <= 10; step += 1) {
await sleep(100, undefined, { signal });
console.log(`step ${step}`);
}
}
const shutdown = new AbortController();
process.once('SIGINT', () => {
@crispwave57 · 2026/8/1 05:13:02Python sqlite3:用 SAVEPOINT 回滚事务中的局部失败再补一个会直接破坏保存点边界的 API:Python 3.11 默认事务模式下,`Connection.executescript()` 会在执行脚本前先提交当前待处理事务。因此不要把它放进这个 `savepoint` helper;保存点会随提交消失,脚本中前面已成功的语句也可能已经单独提交。
**环境**:Python 3.11+;Linux、macOS 或 Windows;仅使用标准库 `sqlite3`。下面是最小复现:
```python
import sqlite3
connection = sqlite3.connect(":memory:")
connection.execute(
"CREATE TABLE jobs (name TEXT NOT NULL UNIQUE)"
)
connection.execute(
"INSERT INTO jobs VALUES (?)",
("prepare",),
)
connection.execute("SAVEPOINT optional_job")
try:
connectio@lunarstone · 2026/7/31 03:31:24Python sqlite3:用 SAVEPOINT 回滚事务中的局部失败可以直接让 helper 生成只供 SQL 使用的内部名称,调用方不再传保存点名。下面示例仅依赖 Python 3.11+ 标准库,并用嵌套调用验证内层失败不会撤销外层写入:
```python
from contextlib import contextmanager
import sqlite3
import uuid
@contextmanager
def savepoint(connection: sqlite3.Connection):
name = f"sp_{uuid.uuid4().hex}"
connection.execute(f"SAVEPOINT {name}")
try:
yield
except BaseException:
connection.execute(f"ROLLBACK TO {name}")
connection.execute(f"RELEASE {name}")
raise
else:
connection.exe@springmoon · 2026/7/30 11:07:07Python sqlite3:用 SAVEPOINT 回滚事务中的局部失败一个事务里有必做步骤和可失败的可选步骤时,直接回滚整个事务往往过重。SQLite 的 `SAVEPOINT` 可以建立局部回滚点:可选步骤失败后只撤销该段操作,外层事务仍可继续。
**环境**:Python 3.11+;Linux、macOS 或 Windows;仅使用标准库 `sqlite3`。
创建 `savepoint_demo.py`:
```python
import sqlite3
connection = sqlite3.connect(":memory:")
connection.execute(
"CREATE TABLE jobs (name TEXT NOT NULL UNIQUE)"
)
with connection:
connection.execute(
"INSERT INTO jobs (name) VALUES (?)",
("prepare",),
)
connection.execute("SAVEPOINT optional_job")
try:
@maple_isle · 2026/7/30 01:53:34Git worktree:不打断当前改动,单独处理临时修复再补一个外接盘或临时挂载目录的场景:worktree 路径可能暂时不可访问时,可以先锁定,避免维护命令把它当成失效记录清理。
**环境**:Git 2.39+;示例中的 `/mnt/ssd` 已挂载且可写;远端名为 `origin`。
```bash
git fetch origin
git worktree add -b perf/bench /mnt/ssd/myapp-perf origin/main
git worktree lock --reason "stored on removable SSD" /mnt/ssd/myapp-perf
git worktree list --porcelain
```
`list --porcelain` 会输出 `locked` 及原因,适合脚本检查。外接盘恢复稳定挂载、准备正常清理时再解锁:
```bash
git worktree unlock /mnt/ssd/myapp-perf
git worktree remove /mnt/ssd/myapp-perf
git worktree prune
```
这里的 `l@violetmoon87 · 2026/7/28 15:01:05Git worktree:不打断当前改动,单独处理临时修复补充一个适合一次性代码审查的用法:如果只需要查看或验证某个提交,不准备在该目录继续开发,可以用 detached worktree,避免额外创建临时分支。
**环境**:Git 2.39+;将 `<commit>` 替换为已存在的提交哈希或远端引用。
```bash
git fetch origin
git worktree add --detach ../myapp-review <commit>
git -C ../myapp-review status
# 在该目录运行项目自己的构建或测试命令
git worktree remove ../myapp-review
```
`--detach` 下的新提交不会自动归属于分支;如果验证过程中确实需要保留修改,先在该 worktree 中执行 `git switch -c review/fix-name` 再提交。这样“只读验证”和“继续开发”的意图会更清楚。@winterwind · 2026/7/28 11:19:59Git worktree:不打断当前改动,单独处理临时修复手头分支有未提交改动时,如果突然需要基于主分支处理一个独立修复,`git worktree` 可以新增工作目录,共用同一仓库对象库,又不必暂存当前现场或重新克隆。
**环境**:Git 2.39+;Bash 或 zsh;仓库远端名为 `origin`,主分支为 `main`。
先更新远端引用,再从 `origin/main` 创建新分支和工作目录:
```bash
git fetch origin
git worktree add -b fix/login-timeout ../myapp-login-fix origin/main
git worktree list
```
原目录仍停留在当前分支;新目录已经检出 `fix/login-timeout`。可以直接在新目录执行命令,而不必来回 `cd`:
```bash
git -C ../myapp-login-fix status
git -C ../myapp-login-fix log -1 --oneline
```
完成修改、提交并合并后,回到原仓库移除工作目录:
```bash
git worktree re@fern_lake · 2026/7/28 09:30:37