多线程编程
进程是资源分配的最小单位,线程是CPU调度的最小单位
每个进程至少有一个线程(主线程)
import threading import time threadlist = ['hi', 'ki', 'jiji'] def action(func): for item in func: print(threading.current_thread().getName() + item) #产生的线程执行的工作 time.sleep(1) for i in range(1,3): t = threading.Thread(target=action, args=(threadlist,)) #产生其他线程 t.start()
线程常用的方法:
join方法:用于阻塞主线程,等子线程运行完在运行主线程
setDaemon方法:主线程结束,子线程也必须跟着结束
join方法:
import threading import time threadlist = ['hi', 'ki', 'jiji'] def action(func): for item in func: print(threading.current_thread().getName() + item) #对线程进行计时 time.sleep(1) thread = [] #创建的新的列表 for i in range(1,3): t = threading.Thread(target=action, args=(threadlist,)) t.start() thread.append(t) #创建的线程加入thread中 for t in thread: t.join() #对线程进行阻塞 print('所有的结束')
setDaemon方法:需要加在start之前,即线程启动之前
t = threading.Thread(target=action, args=(threadlist,)) t.setDaemon(daemonic=True) t.start()
反射
通过字符串的形式在运行时动态的修改程序的变量,方法以及属性操作,并不会实际的修改代码,目的是提升代码运行时的灵活性
常用的4个方法:
hasattr:输入一个字符串,判断对象有没有这个方法或属性
getattr:获取对象属性值或者方法的引用,返回方法的引用,若属性值,直接返回属性值,否则抛出异常
setattr:动态的添加一个方法或者属性
delattr:动态的删除一个方法或属性
class dog: def __init__(self, name): self.name = name def eat(self): print("{}正在吃东西" .format(self.name)) def sleep(self): print("{}正在睡觉。。勿扰" .format(self.name)) Dog = dog("张张") na = input('请输入狗的方法:') if hasattr(Dog, na): try: getattr(Dog, na)() # getattr返回的是一个方法名,需要加() except TypeError: print(getattr(Dog, na)) else: print('输入的方法有误')
setattr:动态的添加一个方法或者属性:
def run(action): print("在跑步,很开心,并{}" .format(action)) #定义一个方法 method = input("请输入要绑定的方法:") #只是名称 setattr(Dog, method, run) #将方法以用户输入的名称进行绑定 print(dir(Dog)) getattr(Dog, method)('hao')