最近遇到一个问题,就是在Windows下怎么杀掉全部的子线程,现把解决方法记录下。

问题来源:

  用python执行了一个bat脚本,脚本的内容是执行一系列的adb命令,然后运行一个server。其中需要在新的cmd窗口中运行这些命令,因为最后会在这个窗口中启动一个server,

这个server会一直在运行。因为使用的是thrift架构,在运行测试脚本之前,必须先先启动这个server。现在的问题是,等到测试用例执行完毕之后,这个server还是在运行的,现在就是

想把这个server在用例执行完之后关掉,但是关不掉。原因如下:

  a)最开始是使用了os.system()来执行bat脚本,这个方法没有拿到PID

  b)然后使pro = subprocess.Popen(cmd.split(), shell=True, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)来新起一个线程,这样虽然拿到了PID,这样有个问题,就是

它的本质是另外开启一个cmd命令来运行 adb命令,接下来及时使用popen.terminate()也只能关闭父进程,adb的进程会有系统来托管,这样是不能杀死adb进程的。然后上网查了一个,发现有

subprocess有一个参数是 creationflags=subprocess.CREATE_NEW_PROCESS_GROUP官方解释如下:

  A Popen creationflags parameter to specify that a new process group will be created. This flag is necessary for using os.kill() on the subprocess

  但是这样还是不能解决问题,因为在运行kill()或者terminate()之后,启动server的那个cmd窗口并没有被关闭。

解决方法:

  最后实在没有办法,就用例一个很笨的方法,在程序运行之前,先获取当前电脑上运行的进程有哪些,在程序运行之后,再获取电脑上有哪些进程,前后对比一下,新增加的进程就是原来启动的进程,今夏这些新增加的进程的PID,

当测试用例结束的时候杀掉这些进程。

还有一个问题很迷惑,就是使用subprocess启动的进程,其进程ID在windows的任务管理器里面查不到,使用taskkill命令杀进程的时候,还会提示找不到这个进程。

Windows下杀掉全部的子线程的更多相关文章

  1. Windows下的PHP安装文件线程安全和非线程安全的区别

    从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用 多进程的工作方式不同的是Windows系统是采用多线程的工作 ...

  2. Windows下一个比较完美的线程池实现(使用线程池实现的Http上传下载实现)

    http://blog.csdn.net/fishjam/article/details/8632049 http://download.csdn.net/user/fishjam

  3. windows 下获取当前进程的线程数量

    #include <TlHelp32.h> int get_thread_amount() { ; ]; PROCESSENTRY32 pe32; pe32.dwSize = sizeof ...

  4. windows主线程等待子线程退出卡死问题

    在windows下调用_beginthread创建子线程并获得子线程id(函数返回值),如果子线程很快退出,在主线程中调用WaitForSingleObject等待该线程id退出,会导致主线程卡死.需 ...

  5. windows环境利用semophore机制进行线程同步

    semophore是信号量的意思,常用于PV操作,所谓PV操作就是pend(等待,直到有资源可用,并且消耗资源) V就是释放资源. semophore和mutex区别,mutex本意为互斥,用于线程独 ...

  6. C# 多线程学习系列四之ThreadPool取消、超时子线程操作以及ManualResetEvent和AutoResetEvent信号量的使用

    1.简介 虽然ThreadPool.Thread能开启子线程将一些任务交给子线程去承担,但是很多时候,因为某种原因,比如子线程发生异常.或者子线程的业务逻辑不符合我们的预期,那么这个时候我们必须关闭它 ...

  7. windows下进程与线程

    windows下进程与线程 Windows是一个单用户多任务的操作系统,同一时间可有多个进程在执行.进程是应用程序的运行实例,可以理解为应用程序的一次动态执行:而线程是CPU调度的单位,是进程的一个执 ...

  8. Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)

    7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...

  9. [笔记]linux下和windows下的 创建线程函数

    linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include <pthread.h> #define CreateThreadEx(ti ...

随机推荐

  1. android ------ AAPT2 error: check logs for details解决方法

    AAPT 是全称是 Android Asset Packaging Tool,它是构建 App,甚至是构建 Android 系统都必不可少的一个工具.它的作用是将所有资源文件压缩打包到Android ...

  2. kubeadm安装kubernetes-v1.13.1

    kubeadm安装kubernetes-v1.13.1 centos虚拟机使用kubeadm安装k8s-v1.13.1. 机器信息如下: 主机名 ip master 192.168.239.200 n ...

  3. web页面锁屏初级尝试

    因为工作需要,所以在网上找了一些素材来弄这个功能.在我找到的素材中,大多都是不完善的.虽然我的也不是很完善,但是怎么说呢.要求不是很高的话.可以直接拿来用的[需要引用jQuery].废话不多说直接上代 ...

  4. Spring Boot:如何优雅的使用 Mybatis

    mybatis-spring-boot-starter 官方说明:MyBatis Spring-Boot-Starter will help you use MyBatis with Spring B ...

  5. lamba匿名函数与内置函数/递归

    max 循环出的参数给func,func的返回值给key,然后比较那个返回值max(salary,key=func) 匿名函数:max(salary,key=lamba x:salaries[x]) ...

  6. Java基本概述

    1.java语言的特点 1.面向对象:基本概念(类,对象) 三大特征:封装.继承.多态 2.健壮性 3.跨平台:通过Java语言的编写的应用程序在不同的系统平台上都能可以进行运行. 2.什么是JDK. ...

  7. Vscode下的Markdown的基本使用

    1.Vscode默认支持Markdown语法,只需要安装相应的扩展插件,Markdown Preview enhanced. 2.安装完插件后,在Vscode上新建一个文件,然后将文件的语言模式设置为 ...

  8. 安装selenium,驱动geckodriver,及出现的问题

    cmd输入安装selenium指令: pip install selenium 1.报错 Could not find a version that satisfies the requirement ...

  9. iis7 设置http 自动跳转到https

    https://www.cnblogs.com/wxbug/p/7054972.html

  10. js中关于声明提前的几个误区

    声明提前: 在程序正式执行之前,都会将所有的var声明的变量提前到开始位置,集中创建,而赋值留在原地. 例如这样一段代码 console.log(a) var a = 100; console.log ...