一个多线程的程序在linux下如何终止?

2011-09-15 22:00:38 +08:00
 Weakdancer
import threading
def bug(num):
while 1:
print "bug!^C may not work!thread-%d"%num

threads=[]
for i in range(4):
threads.append(threading.Thread(target=lambda : bug(i)))
for th in threads:
th.start()

程序是这样的,ctrl+c不起作用

强制关闭终端后依然没有终止

在windows下关闭主窗口后所有线程就退出了

请问在linux下该如何解决呢?
6647 次点击
所在节点    Python
13 条回复
Weakdancer
2011-09-15 22:06:19 +08:00
发现在windows 下ctrl+c 依然不起作用

但是具体问题是:
使用flask绑定80端口后
关闭程序

windows下80端口被释放
linux(fedora14)没有释放,我只能重启,因为我找不到应该在那里释放
mrkschan
2011-09-15 22:07:22 +08:00
先找 process id
`ps -ef | grep python` 或者 `ps -ef | grep py`
kill <process id>
Weakdancer
2011-09-15 22:13:00 +08:00
Livid
2011-09-15 22:13:18 +08:00
Maybe you need to catch KeyboardInterrupt and exit?

I will write code to try now.
ayanamist
2011-09-15 22:19:23 +08:00
在线程中应该用threading.Event来监视,或者是producer-consumer模型的话,要在consumer里匹配一种特殊的TerminateClass,每次queue.get()的时候检测一下。
这才是比较正确的做法,Linux下貌似可以强行发信号停止,不过会丢失数据,并不稳妥。
可以去参考APScheduler或SleekXMPP的设计
Weakdancer
2011-09-15 22:24:45 +08:00
@mrkschan
结束了进程就好了,多谢,不过昨天不知道为何端口没有释放
@Livid
这个感觉不应该是这样解决的
因为我无法控制flask 的app.run(host='192.168.1.104',port=80) 函数的内部实现

我可能需要一个quit方法
专们用来退出所有线程
但是kill掉线程应该不是什么好办法吧
Livid
2011-09-15 22:37:12 +08:00
@Weakdancer 关于控制 Flask app 的进程你可以试试这个:

http://www.supervisord.org/

嗯,我刚才在用代码试验,关于多线程的控制我也没有太多经验,不过对这类问题非常有兴趣。
Weakdancer
2011-09-15 22:45:07 +08:00
@Livid

我看到之前的关于supervisord 的讨论了,我刚才已经安装了,并且准备尝试一下。

不过我更倾向于不用这个就能实现。

因为这个东西不是以web为核心的,只是通过web来控制机械的,所以想尽量的精简。

@ayanamist 多谢大家的帮助

多线程确实是一个很不好掌握的东西,但是带来的性能提升十分显著。
Livid
2011-09-15 23:14:41 +08:00
Livid
2011-09-15 23:16:23 +08:00
现在没有在自己的机器上,用的是别人机器上普通编辑器,所以代码里有奇怪的硬 tab ;)
Weakdancer
2011-09-15 23:39:50 +08:00
@Livid
明天我测试下,非常感谢
ayanamist
2011-09-16 08:53:08 +08:00
@Weakdancer 性能提升要看干什么。如果没有阻塞性操作,那由于GIL的影响,性能反而有点下降的。另外并不是只有多线程才好,gevent、stackless(greenlet)等可以异步的协程结构一样可以达到高性能,同时降低线程切换之间的开销。
jell
2015-04-16 11:20:22 +08:00
@Weakdancer 我现在也出现端口没有释放的问题,有没有函数主动释放之类的

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

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

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

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

© 2021 V2EX