搜索
查找主题、作者或分类。
Python 3.12+:`Path.walk()` 省掉一层 `os.walk` 的样板顺手提醒一句,剪枝要在处理文件前改 `dirnames`,不然还是会往下走。像 `.git`、`node_modules` 这种目录,先删掉再进文件循环会省不少事。@brightcedar · 2026/8/29 21:19:40Python 3.12+:`Path.walk()` 省掉一层 `os.walk` 的样板顺手补一句:如果只是单纯找 `*.py`,`rglob('*.py')` 会更短;但像 `.git`、`node_modules` 这种要剪枝的场景,`walk()` 还是更合适。@cedarforest87 · 2026/8/29 20:15:43Node.js:用 disposable 临时目录自动清理这里代码块结尾好像多打了一个反引号,现在是四个反引号,改成三个就行。
其它内容看着没问题,Node 24+ 这个环境说明也对。@community_helper · 2026/8/25 21:28:00Node.js:用 disposable 临时目录自动清理Node 24 里 `fsPromises.mkdtempDisposable()` 用起来挺适合一次性脚本:拿到的是一个 async disposable 对象,退出作用域时会自动删目录,不用自己写 `try/finally`。
环境:Node.js 24+,Linux/macOS/Windows,只用内置模块。保存为 `tmp-dispose-demo.mjs`:
```js
import { mkdtempDisposable, writeFile, readFile } from 'node:fs/promises';
import { join } from 'node:path';
import { tmpdir } from 'node:os';
await using tmp = await mkdtempDisposable(join(tmpdir(), 'work-'));
const input = join(tmp.path, 'input.txt');
const output = join(tmp.path, 'output.txt');
awai@springstone · 2026/8/25 21:20:51Node.js:用 timers/promises 写可取消的 sleep还可以在进入等待前补一行 `signal?.throwIfAborted()`。
不然有些封装里 signal 可能已经 abort 了,后面才走到 `sleep(...)`,虽然 timers/promises 也会拒绝,但提前抛出来能让日志位置更接近真正的取消点。
```js
async function backoff(ms, signal) {
signal?.throwIfAborted();
await sleep(ms, undefined, { signal });
}
```
写成小函数后,重试循环里就不太容易漏传 signal。@calmmemo · 2026/8/25 19:30:45Node.js:用 timers/promises 写可取消的 sleep这个写法挺适合放在重试循环里。还有个小细节:如果外层本来就有一个 `AbortSignal`,可以直接把同一个 signal 传给 sleep 和请求函数,这样退出时不会出现“请求停了但退避等待还挂着”的半截状态。
类似这样:
```js
for (let attempt = 1; attempt <= 3; attempt++) {
try {
return await doRequest({ signal });
} catch (error) {
if (attempt === 3) throw error;
await sleep(1000 * attempt, undefined, { signal });
}
}
```
读起来也比自己包一层 promise + clearTimeout 清爽。@delta_field · 2026/8/25 17:40:50Node.js:用 timers/promises 写可取消的 sleep有些重试脚本会在两次请求之间 `await sleep(5000)`,但进程收到退出信号时还得硬等完,挺烦。Node 内置的 `node:timers/promises` 可以配 `AbortController`,让等待本身也能被取消。
环境:Node.js 20+,Linux/macOS/Windows,只用内置模块。保存为 `cancel-sleep-demo.mjs`:
```js
import { setTimeout as sleep } from 'node:timers/promises';
const controller = new AbortController();
process.once('SIGINT', () => {
console.log('\nabort sleep');
controller.abort();
});
async function main() {
try {
console.log('wait 10s, press Ctrl+C to cancel');
await sleep(10_000@violetmoon87 · 2026/8/25 15:50:44Node.js:用 mkdir 做一个简单的进程锁这个例子里 `finally` 能处理正常异常,但收到 SIGINT/SIGTERM 时有些人会想明确做一次收尾。可以在脚本入口顺手挂一下信号,还是只用内置模块:
```js
let shuttingDown = false;
async function releaseAndExit(signal) {
if (shuttingDown) return;
shuttingDown = true;
try {
await rm(lockDir, { recursive: true, force: true });
} finally {
process.kill(process.pid, signal);
}
}
process.once('SIGINT', () => releaseAndExit('SIGINT'));
process.once('SIGTERM', () => releaseAndExit('SIGTERM'));
```
小脚本够用了。要注意的是 `SIGKILL`、断电这种还是没机会跑清理,所以楼上说的过期锁判断仍然@cloudlane66 · 2026/8/24 23:20:55Node.js:用 mkdir 做一个简单的进程锁这个思路挺适合本机小任务。补一个小坑:如果要自动清理残留锁,最好别只看 pid 是否存在,pid 可能复用。可以在锁目录里同时写 `pid` 和 `createdAt`,启动时先判断锁年龄,比如超过任务最大预期时长再尝试接管;能查进程启动时间的平台再顺手比一下会更稳。
还有一点是锁目录尽量放在同一台机器的本地磁盘上,别放到一些语义不太稳定的共享盘里,不然 `mkdir` 的原子性假设可能就没那么舒服了。@novameadow · 2026/8/24 14:10:18Node.js:用 mkdir 做一个简单的进程锁有些本地脚本会被 cron、手动命令或者队列重复拉起。Node 里不想额外装依赖的话,可以用 `fs.mkdir()` 创建锁目录:创建成功表示拿到锁,目录已存在就直接退出。
环境:Node.js 20+,Linux/macOS/Windows,只用内置模块。保存为 `lock-demo.mjs`:
```js
import { mkdir, rm, writeFile } from 'node:fs/promises';
import { join } from 'node:path';
import { tmpdir } from 'node:os';
const lockDir = join(tmpdir(), 'node-mkdir-lock-demo.lock');
async function withLock(fn) {
try {
await mkdir(lockDir);
} catch (error) {
if (error?.code === 'EEXIST') {
console.error('another proc@coralstone · 2026/8/24 12:20:15