#6331·nicegui

@await_on_shutdown 对在客户端上下文中调用的处理程序(on_connect、on_click、ui.timer)没有任何影响

作者: evnchn创建于 2026年9月10日更新于 2026年9月14日
标签buganalysis

第一次检查

  • 我在这里增加了一个非常描述性的标题。
  • 这不是一个安全问题。
  • 这不是一个QQA。 我相信NiceGUI及其文件有问题。
  • 我用GitHub搜索 找到一个类似的问题,然后空出。

示例代码

2zz
导入 Ayncio
从 pathlib 导入路径

从 nicegui 导入应用程序、 背景任务、 ui

Out = 路径('s hutdown  probe.txt')
Out.unlink( missing ok=True) (英语).


@ background tasks.await on shutdown (英语).
async def 保存( tag: str) - > 无:
等待Ayncio.sleep(3)# 当火力下方关闭时仍在飞行
以 Out. open ('a') 作为 f :
f. write( tag + “\n” )


async def stop soon () - > 无:
等待 Ayncio.sleep(2) 页面存档备份,存于互联网档案馆
app.shutdown () () 应用


app.on startup(lambda: 保存 ('on startup'))#作品
app.on connect(lambda: 保存 ('on connect')) #已断开
app.on 启动( stop soon)

ui. label ('打开一页, 然后等待几秒钟')
ui.run( 重装为假)

说明

{background task.await on shutdown> 被记录为 *'Tag a async 函数,所以从它所创建的任务不会在关闭时被取消". 这适用于`app.on startup',但适用于在客户情况下援引的处理者——不管怎样,这些处理者在关闭时被悄悄地取消。

运行上面的片段,让页面加载一次,等待自动关闭. `shutdown probe.txt'应包含两行。 实际产出:

启动( S)

连接 ' 缺失。 两人都经历了同一个装饰;只有没有通过客户背景的装饰幸存了下来. 这里的启动 ' 是控制——它证明关闭确实等待受保护的工作,所以区别不是宽限期。

我测量了三个受影响的入口,所有入口仍然被取消:

输入点 发送路径 |-|-|-. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 'ui.timer(0.01,处理器,一次=True)' 'timer' |

机制

`背景 任务.create () 以身份承认受保护的工作:

https://GitHub.com/zauberzeug/nicegui/blob/main/nicegui/background tasks.py#L47 (中文(简体) ).

每一条上下文保存的发送路径在拨打creat ()'之前,将待发件包裹在**新的皮层中,以便sintance ' 检查不再匹配:

  • nicegui/client.py:455'和:482'-`helpers.await with context(结果.)'
  • `nicegui/events.py:486'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  • nicegui/timer.py:45'-coroutine ()'

App.safe invoke' (nicegui/app/app.py:110')直接通过结果',这就是在 启动'是起作用的原因。

这不是倒退,我查过了,还等着呢。 `#5879"用"safe invoke"用共享的"await---context"帮助器来取而代之的手卷"async def result 用 client ()"包装",但旧代码也将可等待者包裹了,所以标记已经被隐藏了. 其行为可追溯到 " wait-on-shutdown " 和 " safe-invoke " ,并在 " v3.16.0 " 上复制。 . . . . . . .

内容来源: zauberzeug/nicegui