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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM