1
zsj1029 11 天前
就算可以,就不优雅了吧,建议问问 chatgpt
|
2
gjquoiai 11 天前
signal.pthread_kill
|
3
ysc3839 11 天前 via Android
kill 不“优雅”,而且是有问题的,比如子线程持有 GIL 时被杀死,那就没办法释放了,其他 Python 线程就被锁死了。除此之外还有对象没正常释放内存泄漏等问题。
|
4
nagisaushio 11 天前
所有优雅的方法都是协作式的
|
5
Garasu 11 天前
你这个 “掐死” 用的很优雅。2333
|
6
keakon 11 天前 2
有一个优雅的办法叫作 PyThreadState_SetAsyncExc ,就是在另一个线程里抛异常……
|
7
LeeReamond 11 天前
三种方法
1. 发信号,问题楼上说了 2. 发异常,不够优雅,通用性是可以的 3. 正常程序设计所指明的方法就是你通过任意一种通信方式指明关闭子线程后,子线程自行终止并退出,这才是优雅的 |
8
yanyao233 11 天前 via Android
“掐死”这个行为本身就不够优雅,我一般会让子线程自杀,“亲,你没用了,可以死了哦~”
|
9
0o0O0o0O0o 11 天前
赞同楼上
|
10
henix 11 天前 1
月经问题
[为什么大多数语言的标准库都不提供或不鼓励使用“杀线程”的功能?]( https://www.zhihu.com/question/569168858) |
11
zictos 11 天前
创建子线程并不会多出进程啊,除非创建子进程。
子进程是可以终止的: https://www.v2ex.com/t/740071 |
12
ClericPy 11 天前
系统级线程,只能让它自己死,stackoverflow 上讨论好多方案,没几个安全或有效的。后来折中方案就是:threading.Event 之类的,或者每隔一点时间轮询或判断超时,别折腾了
现在已经改用进程和协程了,前者代码改动很小,IPC 也不麻烦,后者比较看本事,用不好就全家阻塞 |
13
xiangyuecn 11 天前
取个优雅的函数名字,里面封装了一行 kill 代码
|
14
iorilu 11 天前
最好的法子就是弄个 信号变量, 然后主线程修改这个变量, 子线程判断退出
比如弄个 need_run = True |
15
nuk 11 天前
设计上如果支持 kill safe 就比较方便, 比如 erlang 。
python 能够在 thread 里处理 signal 并且 raise exception 到这个 thread 的话也可以解决,但是不行因为 signal handler 全部在 main thread 里执行。 不过 python 其实是可以从其他线程直接 raise exception 到指定的线程的,参考这里 https://gist.github.com/liuw/2407154 这样就直接用 try 包围一下就行。 |
17
kneo 11 天前 via Android
问错了。你想问的是“如何粗暴的杀死一个线程”。
|
20
iorilu 11 天前
@Motorola3 我觉得这就是最好的方法
因为线程是操作系统控制的, python 不能完全掌控, 程序里有任何地方不能由程序本身控制都可能造成未知风险 除非没其他办法 , 否则还是通过变量控制, 可以做到程序完全掌控是最好的 |
22
realJamespond 10 天前
pthread wait 时发信号唤醒 thread 退出 loop ,如果正在处理 job 就等 job done 时退出
|
23
Motorola3 OP @zictos 我是通过 threading 来创建的子线程 不过外面包了一层 pyqt 的 workThreading 然后打包成.exe 后 就会多出来一个 子进程在任务管理器中 难道是 pyqt6 的原因?
|
26
Maerd 5 天前
你都用 QT 了,多线程操作就使用 QThread 不好么,然后用 QTimer 做轮询,通信用信号和插槽,怎么会影响主窗体更新
|