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 · 6778 次点击
    这是一个创建于 4796 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
       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
       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
       2011-09-15 23:14:41 +08:00
    Livid
        10
    Livid  
    MOD
       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   ·   实用小工具   ·   2790 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:40 · PVG 22:40 · LAX 07:40 · JFK 10:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.