zoukankan      html  css  js  c++  java
  • threading.Thread 子线程强制停止

    import time
    import random
    import threading
    
    
    class MyThread(threading.Thread):
        def __init__(
                self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None, daemon=True):
            threading.Thread.__init__(
                self, group=group, target=target, name=name, args=args, kwargs=kwargs, verbose=verbose)
            
            if kwargs is None:
                kwargs = {}
            self.__target = target
            self.__args = args
            self.__kwargs = kwargs
            self.result = None
            self.daemon = daemon
        
        def run(self):
            try:
                if self.__target:
                    self.result = self.__target(*self.__args, **self.__kwargs)
            finally:
                del self.__target, self.__args, self.__kwargs
        
        def kill(self):
            try:
                self._Thread__stop()
            except:
                pass
    
    
    CURRENT_THREAD = None
    time_out = 5
    
    """
    将线程超时时间 time_out 设置为 10 秒
    如果将 do_sum 结束条件设置为 if tm >= 9 , 则能正常拿到线程执行结果
    如果将 do_sum 结束条件 if tm >= 9 去掉, 则子线程无法结束,线程执行超时机制生效,10秒后,会自动杀死子线程,此时拿到的结果为 None
    子线程执行超时结果格式可以在 base_thread 中设置
    """
    
    
    def termsighandler(signal, frame):
        global sigterm
        sigterm = True
        print('Send stop signal to mod')
        try:
            if CURRENT_THREAD:
                print('Receive the signal, kill thread..')
                CURRENT_THREAD.kill()
        except:
            print('Send stop signal  failed!')
    
    
    def do_sum(target, thread_idx):
        tm = 0
        while True:
            target += 1
            time.sleep(1)
            tm += 1
            if tm >= random.randint(1, 10):
                return target
            print('target is :{}, thread_{}'.format(target, thread_idx))
    
    
    def create_thread(func_service, thread_idx, target):
        new_th = MyThread(target=func_service, args=(target, thread_idx), daemon=True)
        new_th.start()
        new_th.join(time_out)
        if new_th.isAlive():
            print("target:%s time out, kill sub thread" % target)
            new_th.kill()
            
        print('last result:{}'.format(new_th.result))
        result.append(new_th.result)
    
    
    if __name__ == '__main__':
        result = []
        for index, target in enumerate([100, 200, 300, 400, 500]):
            create_thread(do_sum, index, target)
        print('all thread is over, result:{}'.format(result))
  • 相关阅读:
    查看python中SQLite版本和sqlite3版本
    ubuntu系统安装与卸载
    CentOS下如何使用yum查看安装过的软件包
    【linux】CentOS7 升级sqlite3
    什么是Python的metaclass
    Python
    Python对字典分别按键(key)和值(value)进行排序
    python 用正则表达式去除特殊字符的两种方法
    从思维导图中学习javascript第五章字符串函数
    从思维导图中学习javascript第三章数组
  • 原文地址:https://www.cnblogs.com/zhanghaibin16/p/14649429.html
Copyright © 2011-2022 走看看