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 运算符 供重载参考
Jun 11 Python
Python中__new__与__init__方法的区别详解
May 04 Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
pycharm显示远程图片的实现
Nov 04 Python
python多进程重复加载的解决方式
Dec 13 Python
Python模块future用法原理详解
Jan 20 Python
多个python文件调用logging模块报错误
Feb 12 Python
jupyter notebook清除输出方式
Apr 10 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
flask项目集成swagger的方法
Dec 09 Python
python实现学员管理系统(面向对象版)
Jun 05 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做推送服务端实现ios消息推送
2013/07/01 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
2019/03/14 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
2019/05/31 PHP
js小技巧--自动隐藏红叉叉
2007/08/13 Javascript
JavaScript高级程序设计 读书笔记之十一 内置对象Global
2012/03/07 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
jQuery给动态添加的元素绑定事件的方法
2015/03/09 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
老生常谈 关于JavaScript的类的继承
2016/06/24 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
使用canvas进行图像编辑的实例
2017/08/29 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
详解js创建对象的几种方式和对象方法
2021/03/01 Javascript
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
Python验证文件是否可读写代码分享
2017/12/11 Python
在Python中实现shuffle给列表洗牌
2018/11/08 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
馥绿德雅美国官方网站:Rene Furterer头皮护理专家
2019/05/01 全球购物
三维科技面试题
2013/07/27 面试题
港湾网络笔试题
2014/04/19 面试题
函授本科自我鉴定
2014/02/04 职场文书
趣味游戏活动方案
2014/02/07 职场文书
策划总监岗位职责
2014/02/16 职场文书
七年级作文之英语老师
2019/10/28 职场文书
Python实现简单的猜单词
2021/06/15 Python
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript