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
adjclubyb
V2EX  ›  Python

请问一下使用 threading 创建多线程后,要怎样结束掉这些创建的多线程

  •  
  •   adjclubyb · 2017-09-26 15:23:02 +08:00 · 4059 次点击
    这是一个创建于 2650 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请问一下,我用 threading 创建了几个线程去同时运行几个 cmd 的命令,但是这几个命令是不会自己结束掉的,它们一直在运行,我想做成当我输入按键事件的时候结束掉这几个线程。
    例如代码这样写:

    for cmd in cmds:
    th = threading.Thread(target=execCmd, args=(cmd,))
    th.start()
    threads.append(th)
    9 条回复    2017-09-27 17:52:56 +08:00
    hcnhcn012
        1
    hcnhcn012  
       2017-09-26 16:39:41 +08:00 via iPhone
    最好别人工去关掉线程吧,一定要关的话可以自己写一个 stop()或者用 multiprocessing 用多进程实现任务。
    写 stop 的话可以参考
    https://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python
    adjclubyb
        2
    adjclubyb  
    OP
       2017-09-26 16:54:42 +08:00
    @hcnhcn012 那如果使用 multiprocessing 呢?
    geelaw
        3
    geelaw  
       2017-09-26 17:25:25 +08:00   ❤️ 1
    设置一个事件或者变量,告诉那个线程该结束了,然后等这个线程结束。

    注意,杀死一个 cmd 进程不等同于杀死创建该进程的线程,后者可能会导致当前进程坏掉。
    adjclubyb
        4
    adjclubyb  
    OP
       2017-09-26 17:36:43 +08:00
    @geelaw 我刚上手 python 不久,您能详细描述一下吗,要使用那些方法或函数?
    afeicool
        5
    afeicool  
       2017-09-26 17:48:37 +08:00
    Thread.setDaemon(true)
    afeicool
        6
    afeicool  
       2017-09-26 17:50:44 +08:00
    具体到你的代码就是:
    th.setDaemon(True)
    th.start()
    hcnhcn012
        7
    hcnhcn012  
       2017-09-26 20:25:10 +08:00 via iPhone
    @adjclubyb multiprocessing 是 python 内置一个多进程模块,网上有相应的教程的
    impyf104
        8
    impyf104  
       2017-09-26 22:04:45 +08:00 via iPhone
    重写 run 和 stop,留个变量 flag
    def run:
    while(flag):
    Do something
    def stop:
    flag = false
    或者用 setdaemon
    adjclubyb
        9
    adjclubyb  
    OP
       2017-09-27 17:52:56 +08:00
    @impyf104 嗯,但如果使用 setdaemon 就有个问题,我想结束掉这几个子线程之后我的主线程下面还要继续执行,程序还没结束呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2560 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:05 · PVG 11:05 · LAX 19:05 · JFK 22:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.