python杀死一个线程的方法


Posted in Python onSeptember 06, 2015

最近在项目中遇到这一需求:

我需要一个函数工作,比如远程连接一个端口,远程读取文件等,但是我给的时间有限,比如,4秒钟如果你还没有读取完成或者连接成功,我就不等了,很可能对方已经宕机或者拒绝了。这样可以批量做一些事情而不需要一直等,浪费时间。

结合我的需求,我想到这种办法:

1、在主进程执行,调用一个进程执行函数,然后主进程sleep,等时间到了,就kill 执行函数的进程。

测试一个例子:

import time 
import threading 
def p(i): 
  print i 
class task(threading.Thread): 
  def __init__(self,fun,i): 
    threading.Thread.__init__(self) 
    self.fun = fun 
    self.i = i 
    self.thread_stop = False 
  def run(self): 
    while not self.thread_stop: 
      self.fun(self.i) 
  def stop(self): 
    self.thread_stop = True 
def test(): 
  thread1 = task(p,2) 
  thread1.start() 
  time.sleep(4) 
  thread1.stop() 
  return 
if __name__ == '__main__': 
  test()

经过测试只定了4秒钟。

经过我的一番折腾,想到了join函数,这个函数式用来等待一个线程结束的,如果这个函数没有结束的话,那么,就会阻塞当前运行的程序。关键是,这个参数有一个可选参数:join([timeout]):  阻塞当前上下文环境的线程,直到调用此方法的线程终止或到达指定的timeout(可选参数)。

不多说了贴下面代码大家看下:

#!/usr/bin/env python 
#-*-coding:utf-8-*- 
''''' 
author:cogbee 
time:2014-6-13 
function:readme 
''' 
import pdb 
import time 
import threading 
import os 
#pdb.set_trace() 
class task(threading.Thread): 
  def __init__(self,ip): 
    threading.Thread.__init__(self) 
    self.ip = ip 
    self.thread_stop = False 
  def run(self): 
    while not self.thread_stop:   
      #//添加你要做的事情,如果成功了就设置一下<span style="font-family: Arial, Helvetica, sans-serif;">self.thread_stop变量。</span> 
[python] view plaincopy在CODE上查看代码片派生到我的代码片
      if file != '': 
        self.thread_stop = True 
  def stop(self): 
    self.thread_stop = True 
def test(eachline): 
  global file 
  list = [] 
  for ip in eachline: 
    thread1 = task(ip) 
    thread1.start() 
    thread1.join(3) 
    if thread1.isAlive():   
      thread1.stop() 
      continue 
    #将可以读取的都存起来 
    if file != '': 
      list.append(ip) 
  print list 
if __name__ == '__main__': 
  eachline = ['1.1.1.1','222.73.5.54'] 
  test(eachline)

下面给大家分享我写的一段杀死线程的代码。

由于python线程没有提供abort方法,分享下面一段代码杀死线程:

import threading 
import inspect 
import ctypes 
def _async_raise(tid, exctype):
  """raises the exception, performs cleanup if needed"""
  if not inspect.isclass(exctype):
    raise TypeError("Only types can be raised (not instances)")
  res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
  if res == 0:
    raise ValueError("invalid thread id")
  elif res != 1:
    # """if it returns a number greater than one, you're in trouble, 
    # and you should call it again with exc=NULL to revert the effect"""
    ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0)
    raise SystemError("PyThreadState_SetAsyncExc failed")
class Thread(threading.Thread):
  def _get_my_tid(self):
    """determines this (self's) thread id"""
    if not self.isAlive():
      raise threading.ThreadError("the thread is not active")
    # do we have it cached?
    if hasattr(self, "_thread_id"):
      return self._thread_id
    # no, look for it in the _active dict
    for tid, tobj in threading._active.items():
      if tobj is self:
        self._thread_id = tid
        return tid
    raise AssertionError("could not determine the thread's id")
def raise_exc(self, exctype):
    """raises the given exception type in the context of this thread"""
    _async_raise(self._get_my_tid(), exctype)
def terminate(self):
    """raises SystemExit in the context of the given thread, which should 
    cause the thread to exit silently (unless caught)"""
    self.raise_exc(SystemExit)

使用例子:

>>> import time 
>>> from thread2 import Thread 
>>> 
>>> def f(): 
...   try: 
...     while True: 
...       time.sleep(0.1) 
...   finally: 
...     print "outta here" 
... 
>>> t = Thread(target = f) 
>>> t.start() 
>>> t.isAlive() 
True 
>>> t.terminate() 
>>> t.join() 
outta here 
>>> t.isAlive() 
False

试了一下,很不错,只是在要kill的线程中如果有time.sleep()时,好像工作不正常,没有找出真正的原因是什么。已经是很强大了。哈哈。

Python 相关文章推荐
给Python中的MySQLdb模块添加超时功能的教程
May 05 Python
python操作ssh实现服务器日志下载的方法
Jun 03 Python
Python复制文件操作实例详解
Nov 10 Python
python读取一个目录下所有txt里面的内容方法
Jun 23 Python
python使用epoll实现服务端的方法
Oct 16 Python
解决django前后端分离csrf验证的问题
Feb 03 Python
python中PS 图像调整算法原理之亮度调整
Jun 28 Python
python3.7简单的爬虫实例详解
Jul 08 Python
django有外键关系的两张表如何相互查找
Feb 10 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 Python
Python一行代码实现自动发邮件功能
May 30 Python
python超详细实现完整学生成绩管理系统
Mar 17 Python
在Python的Flask框架中验证注册用户的Email的方法
Sep 02 #Python
Python实现身份证号码解析
Sep 01 #Python
实例Python处理XML文件的方法
Aug 31 #Python
通过实例浅析Python对比C语言的编程思想差异
Aug 30 #Python
使用Python脚本将文字转换为图片的实例分享
Aug 29 #Python
Python中常见的数据类型小结
Aug 29 #Python
深入解析Python中的lambda表达式的用法
Aug 28 #Python
You might like
如何把PHP转成EXE文件
2006/10/09 PHP
PHP 输出缓存详解
2009/06/20 PHP
谈谈新手如何学习PHP 默默经典版本
2009/08/04 PHP
thinkPHP5.0框架安装教程
2017/03/25 PHP
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
jquery ajax 检测用户注册时用户名是否存在
2009/11/03 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
js实现绿白相间竖向网页百叶窗动画切换效果
2015/03/02 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
jQuery实现的浮动层div浏览器居中显示效果
2017/02/03 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
2018/11/02 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
JS实现随机点名器
2020/04/12 Javascript
Python学习资料
2007/02/08 Python
python求解水仙花数的方法
2015/05/11 Python
浅析Python pandas模块输出每行中间省略号问题
2018/07/03 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
OPPO手机官方商城:中国手机市场出货量第一品牌
2017/10/18 全球购物
公司业务主管岗位职责
2013/12/07 职场文书
标准毕业生自荐信
2014/06/24 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书
销售员岗位职责
2015/02/10 职场文书
2015年机关作风和效能建设工作总结
2015/07/23 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书