一个多线程的程序在linux下如何终止? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Weakdancer
V2EX    Python

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

  •  
  •   Weakdancer
    weakdancer 2011-09-15 22:00:38 +08:00 7255 次点击
    这是一个创建于 5168 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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下该如何解决呢?
    13 条回复    2015-04-16 11:20:22 +08:00
    Weakdancer
        1
    Weakdancer  
    OP
       2011-09-15 22:06:19 +08:00
    发现在windows 下ctrl+c 依然不起作用

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

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

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

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

    http://www.supervisord.org/

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

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

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

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

    @ayanamist 多谢大家的帮助

    多线程确实是一个很不好掌握的东西,但是带来的性能提升十分显著。
    Livid
        9
    Livid  
    MOD
    PRO
       2011-09-15 23:14:41 +08:00
    Livid
        10
    Livid  
    MOD
    PRO
       2011-09-15 23:16:23 +08:00
    现在没有在自己的机器上,用的是别人机器上普通编辑器,所以代码里有奇怪的硬 tab ;)
    Weakdancer
        11
    Weakdancer  
    OP
       2011-09-15 23:39:50 +08:00
    @Livid
    明天我测试下,非常感谢
    ayanamist
        12
    ayanamist  
       2011-09-16 08:53:08 +08:00
    @Weakdancer 性能提升要看干什么。如果没有阻塞性操作,那由于GIL的影响,性能反而有点下降的。另外并不是只有多线程才好,gevent、stackless(greenlet)等可以异步的协程结构一样可以达到高性能,同时降低线程切换之间的开销。
    jell
        13
    jell  
       2015-04-16 11:20:22 +08:00
    @Weakdancer 我现在也出现端口没有释放的问题,有没有函数主动释放之类的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2640 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 14:20 PVG 22:20 LAX 06:20 JFK 09:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86