ctrl+c关闭多线程python程序

项目中经常需要用到多线程,如果一个python程序用了多线程,当子线程没有结束时,用ctrl+c是关闭不了主线程的,这时候就只能用kill命令杀掉,这样会很麻烦。

所以探讨了下怎么ctrl+C关闭多线程python程序,也在网上查了很多别人的做法,自己做了很多实验,尝试了很多种方法,总结得出一个能用的方法就是,把子线程setDeamon(True),通过isAlive方法实现join的功能。

代码:

#encoding=utf-8
__author__ = ‘[email protected]‘
import threading
from time import sleep
def f():
        sleep(100)
p=threading.Thread(target=f)
p.setDaemon(True)
p.start()
# p.join()
while 1:
    if not p.isAlive():
        break
    sleep(1)
print ‘done‘

当子线程很多的时候,可以用这个函数

def threads_join(threads):
    ‘‘‘
    令主线程阻塞,等待子线程执行完才继续,使用这个方法比使用join的好处是,可以ctrl+c kill掉进程
    ‘‘‘
    for t in threads:
        while 1:
            if t.isAlive():
                sleep(10)
            else:
                break

这种做法的坏处就是令主线程阻塞,直到子线程执行完这个功能的实现太麻烦了,原本用join来实现就好方便很多

下面是研究的过程中的尝试,但是全部都实现不了ctrl+C关闭的功能

原始的多线程程序

def f():
    sleep(100)
p=threading.Thread(target=f)
p.start()
p.join()

print ‘done‘

这是最原始的一个多线程程序。

尝试一:设置线程为守护线程,即加入

p.setDaemon(True)

但是ctrl+c,程序没反应,跟没加是一样的

尝试二:使用信号,因为ctrl c的时候系统会向程序发送sigint信号,所以我们可以令程序捕获这个信号,并调用os的kill方法杀死自己

import signal
import os
import threading
from time import sleep
def f(a,b):
    print ‘kill me‘
    os.kill(os.getpid(),signal.SIGKILL)

def tf():
    sleep(20)

signal.signal(signal.SIGINT,f)
p=threading.Thread(target=tf)
p.start()
p.join()

print ‘done‘

程序运行后,我立刻按ctrl c ,主线程会等子线程sleep20后,才会print ‘kill me‘,证明主线程在等待子线程执行的时候,即join的时候,是捕获不了系统发来的信号的,要等子线程执行完毕,才能捕获。所以这个方法还是不行。

尝试三,用一个标志来让子线程自己结束自己的运行

is_exit=0
def f(a,b):
    global is_exit
    is_exit=1
    print ‘kill me‘
    os.kill(os.getpid(),signal.SIGKILL)

def tf():
    while not is_exit:
        sleep(20)

signal.signal(signal.SIGINT,f)
p=threading.Thread(target=tf)
p.start()
while 1:
    sleep(10)

print ‘done‘

这里加入一个标志is_exit用来标志子线程是否继续执行,然后加入信号,当捕获关闭信号时,把is_exit改为1,令到子线程自己结束,由于主线程在join的状态下是接受不了信号的,所以这里让主线程处于一直等待的状态。

这个做法是能做到ctrl c关闭子线程的,缺点就是子线程需要做完一个循环才能结束,同时主线程没有了join的功能,适用于主线程在给子线程发放任务后就不需要做任何操作的情形。

所以总的来说,ctrl c不能关闭多线程的程序的主要原因是使用了join方法,一旦用了join,主线程就会一直处于阻塞状态,不接受任何外界的联系。但是join方法在实际的业务中是经常需要用到的,我查了很久也没有查到可以替代join的,同时可以被ctrl c的方法。上面第一个程序用到的使用alive方法来实现join的功能的做法算是一个不太好,但又不能不使用它的解决方案了,希望后面能找到更好的实现join功能的方法。

时间: 2024-10-07 00:01:36

ctrl+c关闭多线程python程序的相关文章

sublime text3点击ctrl+B无法运行Python程序?

1.打开sublime text 3 ,选择 tools-->Build System-->New Build System.... 2.将下面代码块复制进新文件中,并命名为Python.sublime-build,保存(默认目录即可) { "cmd": ["python", "-u", "$file"], "file_regex": "^[ ]*File \"(...*?)

python程序打包成exe文件

今天试了试将python程序打包成windows的可执行文件(exe格式) 使用pyinstaller 1.安装 pip install pyinstaller 官网地址:http://www.pyinstaller.org/ 2.打包 打包方式a: pyinstaller 路径+文件 ps:适用执行完程序就可以关闭的python程序 打包方式b: pyinstaller -F 路径+文件 ps:适用需要一直执行的程序,如客户端或服务器形式,不会关闭掉程序,(带有小黑框和调试信息) 打包方式c:

使用Notepad++编译运行C/C++/Python程序

对我来说,比较常用的是C/C++/Python. 使用Notepad++编译运行单个源文件的C/C++/Python,比使用复杂的IDE更加快捷. 想要让Notepad++能够做到编译运行C/C++/Python程序,你需要: 0. 准备好编译器 C/C++编译器,这里推荐MinGW:https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/还有python

Notepad++编写运行python程序

Notepad++编写运行python程序. 1.菜单栏->语言->P->Python设置语言为Python 2.写好代码后ctrl+s保存文件为py文件 3.菜单栏->运行,输入cmd /k cd /d "$(CURRENT_DIRECTORY)" &  python "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT 4.点击保存按钮,将该命令设置为快捷键,如ctrl

122 Python程序中的多进程和多线程

目录 一.什么是进程池或线程池 二.理解同步.异步. 三.multiprocess.Pool模块实现进程池 3.1.1 Pool使用方法 3.1.1 代码实例--multiprocess.Pool 四.Python标准模块--concurrent.futures实现进程池和线程池 4.1 介绍 4.2 基本方法 4.3 代码实例--ProcessPoolExecutor 方式1: 方式2: 方式3 4.4 代码实例--ThreadPoolExecutor 方式1: 方式2: 方式3: 一.什么是

Eclipse+python的安装与使用(详细阐述了eclipse编写Python程序的基本功能及技巧)

安装环境说明: 操作系统:win7 JDK:jdk1.7.0_11 下载网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html Eclipse:eclipse-jee-kepler-SR2-win32-x86_64 下载网址: http://www.eclipse.org/downloads/ http://www.eclipse.org/downloads/download.php?file=/technolo

Python学习教程(Python学习路线):教你如何在交互式环境中执行Python程序

Python学习教程(Python学习路线):教你如何在交互式环境中执行Python程序 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Python基础的内容,以Windows下交互式环境为依托,演示Python程序的运行. 一般来说,顺利安装Python之后,有两种方式可以进入Python交互性环境.一种是在Python自带的IDLE中直接打开交互式窗

Python程序的常见错误(收集篇)

关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Rapid Application Development)中颇为受欢迎,同时Python还能作为脚本语言或者胶水语言讲现成的组件或者服务结合起来.Python支持模块(modules)和包(packages),所以也鼓励程序的模块化以及代码重用. 关于本文 Python简单.易学的语法可能会误导一些Python程序员(特别是那些

Python程序员的10个常见错误(转)

add by zhj:虽然学Python也有两年了,但这些问题的确容易犯,看来对Python的理解还有些地方不深入.先转了,有时间再好好看 译文:http://blog.jobbole.com/68256/ 本文由 伯乐在线 - datorhjaelten 翻译.未经许可,禁止转载!英文出处:toptal.欢迎加入翻译小组. 关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Ra