threading.Thread 使用

  1. 简单的函数封装

def thread_it(func, *args):
    t = threading.Thread(target=func, args=args)
    t.setDaemon(True)
    try:
        t.start()
    except Exception as e:
        raise e


def change1():
    while True:
        pass

thread_it(change1)
thread_it(change2)

# 1.  *args 和 (target=func, args=args)中的args 用法 -> *args的多个参数,实际上args就是元祖
# 2.  上面的用法change1会阻塞change2 ,应该修改成下面的
t1 = threading.Thread(target=change1, args=(alarm_whitelist,))
t2 = threading.Thread(target=change2, args=(alarm_whitelist,))
t1.start()
t2.start()
  1. 简单的类封装

import threading
import time

# make thread exit nicely
class MyThread9(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        global event
        while True:
            if event.isSet():
                logging.warning(self.getName() + " is Running")
                time.sleep(2)
            else:
                logging.warning(self.getName() + " stopped")
                break;


event = threading.Event()
event.set()


def Test9():
    t1 = []
    for i in range(6):
        t1.append(MyThread9())
    for i in t1:
        i.start()
    time.sleep(10)
    q = input("Please input exit:")
    if q == "q":
        event.clear()


if __name__ == '__main__':
    Test9()

2.多进程kill相关


import threading
import time
import inspect
import ctypes


def _async_raise(tid, exctype):
    """raises the exception, performs cleanup if needed"""
    tid = ctypes.c_long(tid)
    if not inspect.isclass(exctype):
        exctype = type(exctype)
    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, None)
        raise SystemError("PyThreadState_SetAsyncExc failed")


def stop_thread(thread):
    _async_raise(thread.ident, SystemExit)


def print_time(e):
    while 2:
        print(e)


if __name__ == "__main__":
    t = threading.Thread(target=print_time, args=("2"))
    t.start()
    time.sleep(0.001)
    stop_thread(t)
    print("stoped")
    time.sleep(2)
    t1 = threading.Thread(target=print_time, args=("1"))
    t1.start()
    time.sleep(0.001)
    stop_thread(t1)
    print("stoped")
    while 1:
        pass

2.多进程kill相关2



import threading

import time
import logging

# logging.basicConfig(level=logging.ERROR, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s:%(message)s')
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s:%(message)s')
logger = logging.getLogger(__name__)

logger.info('infor')
logger.error('errof')
logging.warning('warning')


# make thread exit nicely
class MyThread9(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        global event
        while True:
            if event.isSet():
                logging.warning(self.getName() + " is Running")
                time.sleep(2)
            else:
                logging.warning(self.getName() + " stopped")
                break;


event = threading.Event()
event.set()


def Test9():
    t1 = []
    for i in range(6):
        t1.append(MyThread9())
    for i in t1:
        i.start()
    time.sleep(10)
    q = input("Please input exit:")
    if q == "q":
        event.clear()


if __name__ == '__main__':
    Test9()

3.多进程kill相关3



from functools import wraps
import time
import os
from threading import Thread

def set_time_limit(t):
    def auto_quit(t1):
        '''此为控制进程超时退出的线程函数'''
        time.sleep(t1)
        print("time out {}".format(t1))
        os._exit(1) #此函数专门用于线程控制主进程退出,有兴趣的可以看一下和sys.exit()的区别
    def decorator(f):
        '''此函数用于传入被装饰函数f'''
        @wraps(f)
        def wrapper(*args,**kwargs):
            '''装饰器内部遵循的逻辑是:
            1.auto_quit先执行完,进程结束
            2.被修饰函数f先执行完,auto_quit函数停止执行
            3.被修饰函数执行完,下面的代码才能运行
            '''
            t1=Thread(target=auto_quit,args=(t,))  #此处的t是set_time_limit函数的形参,是auto_quit函数的实参
            t2=Thread(target=f,args=args,kwargs=kwargs)
            t1.setDaemon(True) #满足第2点
            t1.start()
            t2.start()
            t2.join() #满足第3点
        return wrapper
    return decorator


@set_time_limit(3)
def a(t):
    time.sleep(t)
    print("execuate finished")

if __name__=="__main__":
    a(1)
    a(5)
    a(1) # 不会打印了
    print("执行完毕")

posted @ 2020-12-28 14:35  该显示昵称已被使用了  阅读(160)  评论(0编辑  收藏  举报