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爬虫入门教程之糗百图片爬虫代码分享
Sep 02 Python
python编码最佳实践之总结
Feb 14 Python
python获取外网IP并发邮件的实现方法
Oct 01 Python
python如何把嵌套列表转变成普通列表
Mar 20 Python
详解python持久化文件读写
Apr 06 Python
Django中提示消息messages的设置方式
Nov 15 Python
Pytorch之contiguous的用法
Dec 31 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
Mar 09 Python
Python3通过chmod修改目录或文件权限的方法示例
Jun 08 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 Python
python操作redis数据库的三种方法
Sep 10 Python
Pandas 数据编码的十种方法
Apr 20 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中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
简单实现PHP留言板功能
2016/12/21 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
PHP模型Model类封装数据库操作示例
2019/03/14 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
中国地区三级联动下拉菜单效果分析
2012/11/15 Javascript
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
详细解读JavaScript的跨浏览器事件处理
2015/08/12 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
js获取ip和地区
2017/03/10 Javascript
JS数组操作中的经典算法实例讲解
2017/07/26 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
实例详解BootStrap的动态模态框及静态模态框
2018/08/13 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
Vue-Ant Design Vue-普通及自定义校验实例
2020/10/24 Javascript
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
Python人脸识别初探
2017/12/21 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
Flask框架搭建虚拟环境的步骤分析
2019/12/21 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
公司总经理工作职责管理办法
2014/02/28 职场文书
给校长的建议书300字
2014/05/16 职场文书
领导走群众路线整改措施思想汇报
2014/10/12 职场文书
大专护理专业自荐信
2015/03/25 职场文书
党小组鉴定意见
2015/06/02 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js