最近遇到一个问题,就是在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. 规则引擎 drools

    https://www.jianshu.com/p/725811f420db 深入了解Drools 简单介绍 笔者正在做风控系统,风控系统里边存在非常多的规则(比如:age < 16 || ag ...

  2. Django的admin相关

    自定义admin展示的内容 根据之前已经创建好了的models from django.db import models class Person(models.Model): name = mode ...

  3. python -- 函数进阶

    一.函数参数-动态传参       1.形参:         *   在形参位置, 表示此参数为不定参数,接受的是位置参数            并且接收到的位置参数的动态传参都是元组 def fu ...

  4. 通过编写一个简单的日志类库来加深了解C#的文件访问控制

    在程序的开发调试过程及发布运行后的状态监控中,日志都有着极其重要的分量,通过在关键逻辑节点将关键数据记录到日志文件当中能帮助我们尽快找到程序问题所在.网上有不少专业成熟的日志组件可用,比如log4ne ...

  5. 基于thinkphp的后台管理系统模板快速搭建

    当我们在搭建网站的时候,后端开发人员在编写后台的管理系统的时候,往往会因为缺少一个合适的后台管理系统的模板,而必须去重新编写一个,这几天由于工作上的安排,需要去研究一下thinkcmf的后台管理系统, ...

  6. PDF 补丁丁 0.6.0.3427 版发布(修复提取图片问题)

    新的版本进一步改善了导出图片的问题.

  7. 常用的lamp环境以及一些依赖包的安装

  8. Html5 <video>实现摄像头监控问题:html5并不支持rtsp协议,所以使用vlc进行转码,将rtsp转http流,这样<video>才可以直接播放

    今天在写html5中播放旷视C2摄像头视频监控的功能,查了很多资料,才发现Html5 <video>并不支持rtsp协议.后来查到使用第三方转码才得以实现. 这里把方法写下来分享给大家. ...

  9. Vasya And Password(CodeForces - 1051A)

    Vasya came up with a password to register for EatForces — a string ss. The password in EatForces sho ...

  10. es6(一)

    一.let和const: let :块作用域,不能重复声明. const:块作用域,声明的时候必须赋值,声明的值类型不能修改,引用类型由于是指针,所以可以修改. 二.解构赋值: 左边一种结构,右边一种 ...