Windows下杀掉全部的子线程
最近遇到一个问题,就是在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下杀掉全部的子线程的更多相关文章
- Windows下的PHP安装文件线程安全和非线程安全的区别
从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用 多进程的工作方式不同的是Windows系统是采用多线程的工作 ...
- Windows下一个比较完美的线程池实现(使用线程池实现的Http上传下载实现)
http://blog.csdn.net/fishjam/article/details/8632049 http://download.csdn.net/user/fishjam
- windows 下获取当前进程的线程数量
#include <TlHelp32.h> int get_thread_amount() { ; ]; PROCESSENTRY32 pe32; pe32.dwSize = sizeof ...
- windows主线程等待子线程退出卡死问题
在windows下调用_beginthread创建子线程并获得子线程id(函数返回值),如果子线程很快退出,在主线程中调用WaitForSingleObject等待该线程id退出,会导致主线程卡死.需 ...
- windows环境利用semophore机制进行线程同步
semophore是信号量的意思,常用于PV操作,所谓PV操作就是pend(等待,直到有资源可用,并且消耗资源) V就是释放资源. semophore和mutex区别,mutex本意为互斥,用于线程独 ...
- C# 多线程学习系列四之ThreadPool取消、超时子线程操作以及ManualResetEvent和AutoResetEvent信号量的使用
1.简介 虽然ThreadPool.Thread能开启子线程将一些任务交给子线程去承担,但是很多时候,因为某种原因,比如子线程发生异常.或者子线程的业务逻辑不符合我们的预期,那么这个时候我们必须关闭它 ...
- windows下进程与线程
windows下进程与线程 Windows是一个单用户多任务的操作系统,同一时间可有多个进程在执行.进程是应用程序的运行实例,可以理解为应用程序的一次动态执行:而线程是CPU调度的单位,是进程的一个执 ...
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)
7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...
- [笔记]linux下和windows下的 创建线程函数
linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include <pthread.h> #define CreateThreadEx(ti ...
随机推荐
- Golang安装与命令
1. 安装 Windows - https://golang.org/dl/ 下载msi安装包,点击安装即可.安装后cmd运行go version弹出版本号即安装成功. 2. 命令行 生成exe文件 ...
- Linq语句jion on后指定多个条件
代码如下: private void FrmMain_Load(object sender, EventArgs e) { var list1 = Supplier.GetSuppliers(); v ...
- highchart 十字准星 crosshairs
crosshairs: true, crosshairs: [true, true], // 同时启用竖直及水平准星线 crosshairs: [{ // 设置准星线样式 width: 2, colo ...
- laravle 整合 thrift
1,安装thrift https://www.cnblogs.com/sunlong88/p/9965522.html 2,生成 RPC文件 thrift -r --out ./app --gen p ...
- mysql 循环、游标
mysql 循环只能在存储过程.代码记录 CREATE DEFINER=`front`@`%` PROCEDURE `a_1`() BEGIN -- 声明变量,接收游标循环变量 DECLARE _co ...
- python -- 小数据池 is和 == 再谈编码
1.小数据池 python程序是由代码块构成的,一个代码块的文本作为python程序的执行单元. 代码块:一个模块,一个函数,一个类,甚至一个command命令都是一个代码块,一个文件也是一个代码块, ...
- .NET反射简单应用———遍历枚举字段
反射(Reflection)是一个非常强大的工具,可以用来查看和遍历类型和类型成员的元数据:动态创建类型实例,动态调用所创建的实例方法.字段.属性:迟绑定方法和属性.此次要介绍的是使用反射查看类型成员 ...
- javascript 中的number
大家都知道javascript中有五种简单数据类型,number,string,boolean,null,undefined,复杂数据类型是object.本文主要记录下number类型的一些可能不太常 ...
- vs code编写的时候自动回车的原因
今天在书写一个空白的scss文件的时候,刚打2个字就自动回车换行了: 测试了几次,发现了规律就是输入停下来0.5秒左右就会自动换行,比如,打了2个中文,再连续打一个句子,键盘虽然在动,但是vs cod ...
- python 统计单词个数,并按个数与字母排序
# coding: utf-8 # In[1]: import collections str = "Be slow to promise and quick to perform" ...