最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python殺死一個(gè)線程的方法

 更新時(shí)間:2015年09月06日 09:39:30   投稿:mrr  
由于python線程沒(méi)有提供abort方法,所以我們需要自己想辦法解決此問(wèn)題,面對(duì)這一問(wèn)題,小編幫大家解決phthon殺死一個(gè)線程的方法,需要的朋友一起來(lái)學(xué)習(xí)吧

最近在項(xiàng)目中遇到這一需求:

我需要一個(gè)函數(shù)工作,比如遠(yuǎn)程連接一個(gè)端口,遠(yuǎn)程讀取文件等,但是我給的時(shí)間有限,比如,4秒鐘如果你還沒(méi)有讀取完成或者連接成功,我就不等了,很可能對(duì)方已經(jīng)宕機(jī)或者拒絕了。這樣可以批量做一些事情而不需要一直等,浪費(fèi)時(shí)間。

結(jié)合我的需求,我想到這種辦法:

1、在主進(jìn)程執(zhí)行,調(diào)用一個(gè)進(jìn)程執(zhí)行函數(shù),然后主進(jìn)程sleep,等時(shí)間到了,就kill 執(zhí)行函數(shù)的進(jìn)程。

測(cè)試一個(gè)例子:

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()

經(jīng)過(guò)測(cè)試只定了4秒鐘。

經(jīng)過(guò)我的一番折騰,想到了join函數(shù),這個(gè)函數(shù)式用來(lái)等待一個(gè)線程結(jié)束的,如果這個(gè)函數(shù)沒(méi)有結(jié)束的話,那么,就會(huì)阻塞當(dāng)前運(yùn)行的程序。關(guān)鍵是,這個(gè)參數(shù)有一個(gè)可選參數(shù):join([timeout]):  阻塞當(dāng)前上下文環(huán)境的線程,直到調(diào)用此方法的線程終止或到達(dá)指定的timeout(可選參數(shù))。

不多說(shuō)了貼下面代碼大家看下:

#!/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:   
      #//添加你要做的事情,如果成功了就設(shè)置一下<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 
    #將可以讀取的都存起來(lái) 
    if file != '': 
      list.append(ip) 
  print list 
if __name__ == '__main__': 
  eachline = ['1.1.1.1','222.73.5.54'] 
  test(eachline)

下面給大家分享我寫(xiě)的一段殺死線程的代碼。

由于python線程沒(méi)有提供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

試了一下,很不錯(cuò),只是在要kill的線程中如果有time.sleep()時(shí),好像工作不正常,沒(méi)有找出真正的原因是什么。已經(jīng)是很強(qiáng)大了。哈哈。

相關(guān)文章

  • python中的異步爬蟲(chóng)詳解

    python中的異步爬蟲(chóng)詳解

    這篇文章主要介紹了python中的異步爬蟲(chóng)詳解,所謂的異步異步?IO,就是發(fā)起一個(gè)?IO?阻塞的操作,但是不用等到它結(jié)束,可以在它執(zhí)行?IO?的過(guò)程中繼續(xù)做別的事情,當(dāng)?IO?執(zhí)行完畢之后會(huì)收到它的通知,需要的朋友可以參考下
    2023-08-08
  • Python 操作mysql數(shù)據(jù)庫(kù)查詢之fetchone(), fetchmany(), fetchall()用法示例

    Python 操作mysql數(shù)據(jù)庫(kù)查詢之fetchone(), fetchmany(), fetchall()用法示例

    這篇文章主要介紹了Python 操作mysql數(shù)據(jù)庫(kù)查詢之fetchone(), fetchmany(), fetchall()用法,結(jié)合實(shí)例形式分析了Python使用pymysql模塊的fetchone(), fetchmany(), fetchall()方法進(jìn)行mysql數(shù)據(jù)庫(kù)查詢的操作技巧,需要的朋友可以參考下
    2019-10-10
  • Python進(jìn)階多線程爬取網(wǎng)頁(yè)項(xiàng)目實(shí)戰(zhàn)

    Python進(jìn)階多線程爬取網(wǎng)頁(yè)項(xiàng)目實(shí)戰(zhàn)

    這篇文章主要為大家介紹了Python進(jìn)階,Python多線程爬取網(wǎng)頁(yè)項(xiàng)目實(shí)戰(zhàn)的示例呈現(xiàn)步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • matplotlib bar()實(shí)現(xiàn)百分比堆積柱狀圖

    matplotlib bar()實(shí)現(xiàn)百分比堆積柱狀圖

    這篇文章主要介紹了matplotlib bar()實(shí)現(xiàn)百分比堆積柱狀圖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python中多個(gè)數(shù)組行合并及列合并的方法總結(jié)

    Python中多個(gè)數(shù)組行合并及列合并的方法總結(jié)

    下面小編就為大家分享一篇Python中多個(gè)數(shù)組行合并及列合并的方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • python?argparse模塊傳參用法實(shí)例

    python?argparse模塊傳參用法實(shí)例

    這篇文章主要為大家介紹了python?argparse模塊傳參用法實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • python數(shù)組中的?k-diff?數(shù)對(duì)例題解析

    python數(shù)組中的?k-diff?數(shù)對(duì)例題解析

    這篇文章主要介紹了python數(shù)組中的?k-diff?數(shù)對(duì)例題解析,文章根據(jù)題目?jī)?nèi)容對(duì)其進(jìn)行分析以此展開(kāi)主題內(nèi)容,感興趣的小伙伴可以參考一下下面文章詳情
    2022-06-06
  • Python的動(dòng)態(tài)重新封裝的教程

    Python的動(dòng)態(tài)重新封裝的教程

    這篇文章主要介紹了Python的動(dòng)態(tài)重新封裝的教程,本文來(lái)自于IBM的官方開(kāi)發(fā)者文檔,需要的朋友可以參考下
    2015-04-04
  • 詳解Python3 對(duì)象組合zip()和回退方式*zip

    詳解Python3 對(duì)象組合zip()和回退方式*zip

    這篇文章主要介紹了Python3 對(duì)象組合zip()和回退方式*zip詳解,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • python基于Tkinter實(shí)現(xiàn)人員管理系統(tǒng)

    python基于Tkinter實(shí)現(xiàn)人員管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python基于Tkinter實(shí)現(xiàn)人員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評(píng)論

山阴县| 城固县| 凤凰县| 凤台县| 北川| 砀山县| 和林格尔县| 响水县| 罗源县| 吴忠市| 海淀区| 夏津县| 丁青县| 浦城县| 开封县| 灯塔市| 青川县| 新化县| 江门市| 湾仔区| 永仁县| 红原县| 中山市| 十堰市| 泾川县| 乌兰察布市| 胶州市| 大丰市| 神池县| 文登市| 翁源县| 庆安县| 宣武区| 金塔县| 林州市| 时尚| 敦化市| 五原县| 富锦市| 将乐县| 松阳县|