threading.Thread 使用
- 简单的函数封装
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()
- 简单的类封装
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("执行完毕")