搜索

查找主题、作者或分类。

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
找到 240 条结果