1
xeaglex 2019-10-15 12:15:24 +08:00 via Android
Select 可以用来实现超时
|
2
reus 2019-10-15 12:16:58 +08:00
没有这种东西,你这种设计才是粗暴的侵入吧
你可以用多个程序,然后用 exec.Cmd.Process.Kill |
3
rrfeng 2019-10-15 12:20:03 +08:00
既然都设置 timeout 了那就用 context.Cancel() 呗。也加不了几行。
|
4
index90 2019-10-15 12:30:25 +08:00
标准的方式用 ctx 控制超时啊
|
5
yeya24 2019-10-15 12:31:56 +08:00 via iPhone
协程本身就不支持这样的,只能协程自己退出。你想结束它唯一办法就是 kill
|
10
index90 2019-10-15 12:39:36 +08:00
goroutine 不是线程啊,而 go 又没有 vm 给你做协程的控制,协程就是有用户(开发者)自己用代码控制的啊。
|
11
hst001 2019-10-15 12:45:41 +08:00
你这个想法太暴力了,最好是协程能自己控制,超时到的时候释放各种资源然后退出协程
|
12
lasuar OP @index90 老哥点破我了,确实协程的概念是开发者调度的。好吧,也许是 golang 的 go func()这种极简的设计方式让我把对线程的思考方式代入协程里面了。
|
13
reus 2019-10-15 12:48:01 +08:00 1
|
15
reus 2019-10-15 12:51:44 +08:00
|
16
t123yh 2019-10-15 13:04:06 +08:00 via Android
一个线程并不是随时都可以安全退出的,在某些状态下,一个线程并不能安全地退出,如果这时它被强行结束,可能会破坏程序状态。所以需要你在线程中的“安全地带”处检测是否要退出线程并主动退出,而不能直接从外部 kill 掉它。
|
17
lasuar OP @t123yh 了解,你说的是线程内使用了锁或者打开的文件资源这些情况吧。因为 kill 是 OS 提供的,调用是开发者执行的,所以开发者在 kill 的时候必须考虑到这些情况。这个就不在帖子讨论的主题范围了
|
18
xeaglex 2019-10-15 13:12:59 +08:00 via Android 1
。。。楼主问个问题还这么有性格
|
19
rrfeng 2019-10-15 16:53:38 +08:00 2
线程 /进程
外部发送 kill 信号给它,它会在内部检测到,然后进行合适的处理,只是被封装好了你看不到这个而已 ---> 这个跟 context 解决 goroutine 是完全一致的。 那么就只剩下 kill -9 的问题了: 线程 /进程是有独立的资源的,强制终结之后操作系统会回收处理。不会影响其他程序运行。 但是 goroutines 里有大量的共享资源,变量、内存、引用地址等等,根本无法辨别,所以就无法处理了。所以没有 kill -9 |
20
Leigg 2019-10-15 19:45:12 +08:00 via Android
@rrfeng 第一段话可以理解。 但是线程也可以使用全局变量,也可以做一些锁行为,这时候 kill 也会有问题,kill 与否由开发者决定。goroutine 拥有的资源线程一样有啊,你没有说到点子上。
|
21
useben 2019-10-15 20:39:36 +08:00
协程不是内核态的,不像进程和线程,分配了 pid,而且是应用层分配资源和调度的,所以没办法 kill
|