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之不要红头文件(2)
Sep 28 Python
Python找出9个连续的空闲端口
Feb 01 Python
python3 模拟登录v2ex实例讲解
Jul 13 Python
python thrift搭建服务端和客户端测试程序
Jan 17 Python
Tensorflow卷积神经网络实例进阶
May 24 Python
Python FFT合成波形的实例
Dec 04 Python
python如何从键盘获取输入实例
Jun 18 Python
python 制作简单的音乐播放器
Nov 25 Python
python中xlrd模块的使用详解
Feb 01 Python
Python趣味实战之手把手教你实现举牌小人生成器
Jun 07 Python
通过Python把学姐照片做成拼图游戏
Feb 15 Python
Python+OpenCV实现在图像上绘制矩形
Mar 21 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编程网上资源导航
2006/10/09 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
PHP Primary script unknown 解决方法总结
2019/08/22 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
JS实现漂亮的时间选择框效果
2016/08/20 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
vue修改vue项目运行端口号的方法
2017/08/04 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
Koa 中的错误处理解析
2019/04/09 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
vue 中url 链接左边的小图标更改问题
2019/12/30 Javascript
如何使用JavaScript检测空闲的浏览器选项卡
2020/05/28 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队Mineski晋级之路
2018/04/07 DOTA
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
在Django的模型中执行原始SQL查询的方法
2015/07/21 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
TensorFlow变量管理详解
2018/03/10 Python
python 读取Linux服务器上的文件方法
2018/12/27 Python
python的slice notation的特殊用法详解
2019/12/27 Python
对tensorflow 中tile函数的使用详解
2020/02/07 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
跨域修改iframe页面内容详解
2019/10/31 HTML / CSS
远东集团网络工程师面试题
2014/10/20 面试题
怎样自定义一个异常类
2016/09/27 面试题
高中军训感言500字
2014/02/24 职场文书
天气温馨提示语
2015/07/14 职场文书
《刷子李》教学反思
2016/02/20 职场文书
民事调解协议书
2016/03/21 职场文书