最近遇到一个问题,就是在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. MySQL 存储过程的变量

    MySQL  存储过程的变量 变量是一个命名数据对象,变量的值可以在存储过程执行期间更改.我们通常使用存储过程中的变量来保存直接/间接结果. 这些变量是存储过程的本地变量. 注意:变量必须先声明后,才 ...

  2. R代码展示各种统计学分布 | 生物信息学举例

    二项分布 | Binomial distribution 泊松分布 | Poisson Distribution 正态分布 | Normal Distribution | Gaussian distr ...

  3. Docker生态会重蹈Hadoop的覆辙吗?

    Docker生态会重蹈Hadoop的覆辙吗? http://mp.weixin.qq.com/s?__biz=MzA5NDg3ODMxNw==&mid=2649535024&idx=1 ...

  4. 跟踪mqttv3源码(二)

    对于spring-mqtt.xml中的标签: <int-mqtt:message-driven-channel-adapter> <int-mqtt:outbound-channel ...

  5. zzw原创_linux下的ping6用法

    [oracle@sv0379 ~]$ /sbin/ifconfig  -aeth0      Link encap:Ethernet  HWaddr 00:E0:81:BC:4B:08         ...

  6. Spring Boot Actuator [监控与管理]

    1. 如何添加 2. actuator 的原生端点(API) 2.1 应用类配置 2.1.1 http://localhost:8080/actuator/conditions 2.1.2 http: ...

  7. 学号 2018-2019-20175212 实验一 《Java开发环境的熟悉》

    学号 2018-2019-20175212 实验一 <Java开发环境的熟悉> 一.实验内容及步骤 1.使用JDK编译.运行简单的Java程序 mkdir 20175212exp1创建20 ...

  8. Python 计算π及进度条显示

    一,首先打开命令提示符找到Python路径,输入pip install tqdm下载第三方库tpdm. 二,写程序 法一 from math import * from tqdm import tqd ...

  9. Response重定向实现参数隐藏

    最近在弄一个SSH项目,前期已经做好了,现在的需求是进行单点登陆实现,涉及到重定向跳转(带有参数那种)情况,但是不能在地址栏上出现参数的信息,需要进行参数的隐藏跳转.由于时间比较急,本人没来得及开发一 ...

  10. SGD、GD

    GD参考: https://blog.csdn.net/CharlieLincy/article/details/70767791 SGD参考:https://blog.csdn.net/Charli ...