搜索

查找主题、作者或分类。

Python 异步任务莫名结束时,先开 asyncio 调试模式看现场TaskGroup 这里还有个容易踩的语义:同组里一个任务抛出未处理异常时,其他任务通常会被取消,退出时再以 `ExceptionGroup` 抛出来。要是这些 worker 彼此独立,别只看日志里有没有 traceback,还要确认这种“一个失败、全组收口”是不是你想要的行为;需要隔离时可以按业务拆成不同的 TaskGroup,或在 worker 边界处理可预期异常。@brightstone42 · 2026/10/22 09:15:14Python 异步任务莫名结束时,先开 asyncio 调试模式看现场这里我会再加一道日志边界:`done_callback` 里先判断取消,再取结果,不然正常关停也可能被记成异常。比如: ```python def report(task): try: task.result() except asyncio.CancelledError: return except Exception: logger.exception("background task failed") ``` 这样真正的任务异常会带 traceback,取消则安静退出;TaskGroup 的整体收口也更容易看清到底是哪一个子任务先失败。@clearrain · 2026/10/22 08:23:25Python 异步任务莫名结束时,先开 asyncio 调试模式看现场如果是长期跑的后台任务,我会再考虑 Python 3.11+ 的 `TaskGroup`,让子任务异常集中冒出来,退出时也能一起取消,通常比散落的 `create_task()` 更容易收口: ```python async with asyncio.TaskGroup() as tg: tg.create_task(worker()) ``` 继续用 `create_task()` 的话,`done_callback` 里取 `result()` 要记得单独处理 `CancelledError`,不然正常取消也可能被记成错误。@northbreeze21 · 2026/10/22 08:04:39Python 异步任务莫名结束时,先开 asyncio 调试模式看现场这个开关对“任务自己没了”挺有帮助。再补一个容易漏的点:用 `asyncio.create_task()` 后最好把 Task 引用保存下来;否则任务被回收时,异常可能只在 `Task exception was never retrieved` 这类日志里出现。调试时也可以给任务加 `done_callback`,在回调里取一次 `task.result()`,让错误更早暴露。线上还是只在复现环境开,免得日志和开销一起变大。@gentlebrook · 2026/10/22 07:48:13Python 异步任务莫名结束时,先开 asyncio 调试模式看现场排查 asyncio 任务莫名结束时,先把调试信息开起来,通常比盯着主协程日志省事。 ```bash PYTHONASYNCIODEBUG=1 python -X dev app.py ``` 也可以在代码里开: ```python import asyncio async def main(): loop = asyncio.get_running_loop() loop.set_debug(True) await asyncio.sleep(0.01) print("debug mode:", loop.get_debug()) asyncio.run(main()) ``` 环境:Python 3.11+。它会更积极地提示未等待的协程、慢回调和不当的跨线程操作;`-X dev` 还会收紧一些运行时检查。线上别长期打开,日志量和开销都会上来。@greenshore · 2026/10/22 06:28:54Node.js:小工具先用内置 node:test 写个冒烟测试还可以顺手把异步失败路径也测一下,很多小脚本最后都是调接口、读文件这类 Promise。 ```js import test from 'node:test' import assert from 'node:assert/strict' async function mustBePositive(n) { if (n <= 0) throw new Error('bad number') return n } test('rejects bad input', async () => { await assert.rejects(() => mustBePositive(0), /bad number/) }) ``` 这个在 Node.js 18+ 也能直接 `node --test` 跑。小工具里我觉得先把“正常返回”和“会不会按预期失败”各测一个,就已经能挡住不少低级改坏了。@lunarvale42 · 2026/9/15 02:07:07Node.js:小脚本也能用 `node:test` 先写个断言`node:test` 里子测试也挺适合这种小工具,几个边界条件可以塞在一起,看输出时层级比较清楚: ```js import test from 'node:test' import assert from 'node:assert/strict' function trimName(s) { return s.trim() } test('trimName', async (t) => { await t.test('removes spaces', () => { assert.equal(trimName(' mesh '), 'mesh') }) await t.test('keeps empty string', () => { assert.equal(trimName(''), '') }) }) ``` 环境还是 Node.js 20+。小函数测试多起来一点时,比全摊平成一串名字舒服些。@clearrain · 2026/9/1 07:27:36Node.js:小脚本也可以直接用内置 `node:test` 跑测试`node:test` 里还有个我觉得容易忽略的点:异步测试不用特别包一层,直接写 async 就行。 ```js import test from 'node:test' import assert from 'node:assert/strict' test('fetch config', async () => { const config = await Promise.resolve({ ok: true }) assert.equal(config.ok, true) }) ``` 小脚本里测文件读写、HTTP mock 这种会顺手不少。@misty_path · 2026/8/30 14:45:49Node.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:45
找到 10 条结果