吐槽一下 windows 的终端的一个天坑

2023-12-04 14:03:20 +08:00
 vituralfuture

一个 django 开发的后端,因为是学校里的学长组织的项目,所以给了一个他们实验室里的一台 windows 作为服务器,平时远程上去用。最近有一个接口account/check经常卡死,具体情况就是

其他接口都正常

我上服务器上排查了一下,发现了一个天坑 cmd 窗口在选中模式下,account/check会卡死,其他接口正常但是终端没有输出( django 处于调试或者开发模式,每请求一次都打印在终端)

去网上查了一下,找到了这个 https://stackoverflow.com/questions/33883530/why-is-my-command-prompt-freezing-on-windows-10

虽然不知道为什么只有account/check会出现这个问题,不过可以确定这个选择模式真是一个大聪明

网上找到的解决方案是:关闭 Quick Edit Mode

但我觉得这还是不太方便。如果这种大聪明功能一多,岂不是拿到一台新的 windows 机器还要设置一堆东西?我觉得可能是使用终端的方式错了,v 友们有没有遇到这个问题?都是怎么解决的?

6475 次点击
所在节点    Windows
48 条回复
aLazarus
2023-12-04 15:32:20 +08:00
@ShadowPower #11 听上去似乎可以在 dnf 上卡技能?
tool2d
2023-12-04 15:47:19 +08:00
我也遇到过,也是远程开发控制台程序。

结论是,不要用控制台输出就可以了,改成日志输出。
adoal
2023-12-04 15:51:10 +08:00
顺便说一下,如果是 Linux 下正经的生产环境里跑的业务系统,并不建议用交互登录的用户 nohup & 挂后台。至少要写个 systemd unit 或者别的服务管理器下的配置,用不能交互登录的服务专用用户来运行。
ShadowPower
2023-12-04 15:52:29 +08:00
@aLazarus 我记忆里有两个:
QQ 堂冒险模式:通关或者死亡之前先用这个方式卡半分钟以上,会导致游戏重复结算通关,获得的经验翻倍。卡越久翻倍越多,卡太久会掉线。
DNF 决斗场:被人浮空连招,拖拽窗口可以把对方的连招断掉。

后来 Windows 7 上不管用了。
ysc3839
2023-12-04 16:04:51 +08:00
@ShadowPower 这个问题是游戏自己的问题,直到 Win11 也存在。这是因为游戏把自己的逻辑和界面的消息循环放在了一起,打开标题栏菜单时,系统会进入另一个循环,游戏自己的循环是阻塞住的,也就导致游戏自己的逻辑无法运行。正确做法是把游戏自己的逻辑放到单独的线程中执行。
ysc3839
2023-12-04 16:19:25 +08:00
@kenvix @ShadowPower
Unix 终端也有类似特性,按 Ctrl+S 可以暂停输出。不过和 Windows 控制台不同,Unix 终端暂停输出后不是立刻阻塞,还有缓冲区可以写一段内容才会阻塞。
Windows 控制台立刻阻塞应该是因为设置文字颜色格式等是通过 API 调用实现的,不阻塞的话就会出现程序以为输出了内容,但实际没输出,然后程序又去调用 API 设置了颜色,此时再恢复输出,之前没输出的那部分就会用当前的颜色出现。
比如程序预期输出白色的 abc 和红色的 def ,实际的执行流程是输出 abc ,调用 API 设置颜色为红色,再输出 def 。假如输出 abc 之前用户暂停了输出,但是程序那里又没阻塞,程序执行完以上流程后,当前的文字颜色是红色,但是 abcdef 都还没输出,用户恢复输出后,就会导致 abcdef 都变成红色。
aLazarus
2023-12-04 16:19:29 +08:00
@ShadowPower #23 狂战士卡大吸也可以我记得
ysc3839
2023-12-04 16:25:56 +08:00
@ysc3839 另外从实际来看,Windows 控制台其实是在滥用“暂停输出”这个功能。因为从原理上讲完全可以实现选择文本时滚动条固定在当前位置,新的内容继续往后输出。Windows 控制台好像是不支持滚动条位置固定继续输出,有新内容都会滚动到最底下,于是就投机取巧直接暂停输出。如果换了其他终端比如 Windows Terminal ,就没有这样的问题。
flyup
2023-12-04 16:31:14 +08:00
我遇到过,解决方法: https://www.cnblogs.com/qy1234/p/12613887.html
Chancel
2023-12-04 16:32:13 +08:00
@adoal 是的

在`Linux`下跑后台一般也不用`nohup`,简单的`supervisor`,复杂的`systemd`

Windows 下可以看看计划任务(类似 nohup ),`nssm`(这个类似`supervisor`)
tomczhen
2023-12-04 16:39:15 +08:00
不管啥平台下面也不推荐用 python run server 来跑就是了。
chackchackGO
2023-12-04 17:01:11 +08:00
@Chancel 在`Linux`下跑后台***一般也不用***`nohup`?
boris1993Jr
2023-12-04 17:01:41 +08:00
@ShadowPower #11 直到 Windows 11 都有这个特性。我用这个特性卡 GTA5 的单人房间。
PrinceofInj
2023-12-04 19:21:07 +08:00
这都是祖传特性了,知道了 3 的话其实挺好用的,有时候输出内容过多,随便一点鼠标阻塞起来看起来比较方便。但是碰上不知道的真的就是天坑了,新的 wt.exe 没有这个行为了,还有点怪不习惯的
hez2010
2023-12-04 19:35:42 +08:00
你可以在系统设置的开发者模式下把默认终端从 cmd 改成 Windows terminal ,这样就会用上新的 conhost 没有这种问题了。
adoal
2023-12-04 20:43:59 +08:00
@chackchackGO 后台跑数据处理等一次性的、属于当前用户的计算任务还是适合用 nohup 的。这里说的是长期运行(理论上你不去停止它它就永远运行)的服务。
aisk
2023-12-04 20:55:01 +08:00
过几天你又会发现一个 Python 的“天坑”,如果一个接口没返回,这个时候整个服务器不就接收响应其他请求了,大家都只能排队慢慢等🐶
512357301
2023-12-04 21:52:29 +08:00
python 是跨平台的,还不如用 linux 跑,顺便装个 docker ,还能解决多版本和后台问题
hxy100
2023-12-04 23:02:20 +08:00
不需要终端交互的场景下,可以选择隐藏运行 CMD 窗口的方式来运行你的程序,即可规避问题。

----
比如常见的 VBS 脚本实现:

Set Wsh=CreateObject("Wscript.Shell")
Wsh.run "D:\scripts\app_start.bat",vbHide
opengps
2023-12-04 23:20:41 +08:00
这个功能一直有,选中了就是挂起暂停的效果,做命令行调试时候非常好用,但这个并不是给生产环境准备的,所以生产环境关掉即可

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/997469

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX