每日一记
1,join daemon
join:挂起主线程,待当前线程结束之后,再继续执行挂起主线程(可以指定挂起时间) t1.join(timeout=5)
setDaemon(): 设置守护线程
2,可重入锁(递归锁) RLock
3,信号量:是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码不被并发调用。
4,定时器
5,事件 Event
6,线程队列
import threading,time
def run():
for i in range(100):
time.sleep(0.1)
print("子线程结束")
t1 = threading.Thread(target=run)
t1.setDaemon(True) #守护线程
t1.start()
t1.join(timeout=5) #挂起,设置挂起时间为5秒
print("主线程结束")
#哲学家进餐问题
import threading,time
rlock1 = threading.RLock()
rlock2 = threading.RLock()
rlock3 = threading.RLock()
rlock4 = threading.RLock()
rlock5 = threading.RLock()
class zhexuejia():
def __init__(self,left,right):
self.left = left
self.right = right
z1 = zhexuejia(rlock5,rlock1)
z2 = zhexuejia(rlock1,rlock2)
z3 = zhexuejia(rlock2,rlock3)
z4 = zhexuejia(rlock3,rlock4)
z5 = zhexuejia(rlock4,rlock5)
def run(z,name):
f = z.left.acquire()
if f :
print(name,"获取左筷子")
ff = z.right.acquire()
if ff:
print(name,"获取右筷子")
print(name,"哲学家开始就餐")
time.sleep(1)
z.right.release()
z.left.release()
t1 = threading.Thread(target=run,args=(z1,"z1"))
t2 = threading.Thread(target=run,args=(z2,"z2"))
t3 = threading.Thread(target=run,args=(z3,"z3"))
t4 = threading.Thread(target=run,args=(z4,"z4"))
t5 = threading.Thread(target=run,args=(z5,"z5"))
t1.start()
t2.start()
t3.start()
t4.start()
t5.start()
#用信号量(可以多个线程同时进行)执行多个线程
import threading,time
s = threading.Semaphore(3)
def run(name):
s.acquire()
print(name,"开始执行")
time.sleep(1)
print(name,"执行结束")
s.release()
start_time = time.time()
t1 = threading.Thread(target=run,args=("t1",))
t2 = threading.Thread(target=run,args=("t2",))
t3 = threading.Thread(target=run,args=("t3",))
t4 = threading.Thread(target=run,args=("t4",))
t5 = threading.Thread(target=run,args=("t5",))
t6 = threading.Thread(target=run,args=("t6",))
t7 = threading.Thread(target=run,args=("t7",))
t8 = threading.Thread(target=run,args=("t8",))
t9 = threading.Thread(target=run,args=("t9",))
t10 = threading.Thread(target=run,args=("t10",))
t1.start()
t2.start()
t3.start()
t4.start()
t5.start()
t6.start()
t7.start()
t8.start()
t9.start()
t10.start()
t1.join()
t2.join()
t3.join()
t4.join()
t5.join()
t6.join()
t7.join()
t8.join()
t9.join()
t10.join()
end_time = time.time()
print(end_time-start_time)#打印一共进行了多长时间
#定时器(一种特殊的线程)
import threading
def deal_task(n):
print("%s我被执行了" %n)
t = threading.Timer(3,deal_task,args=(10,))
t.start()
#Event的使用 红绿灯
import threading,time
e = threading.Event()
def light():
print("现在是红灯")
time.sleep(5)
e.set()
print("现在是绿灯")
def car_run(name):
print(name,"迎面驶来")
e.wait()
print(name,"继续前行")
for i in range(10):
t = threading.Thread(target=car_run,args=(i,))
t.start()
h = threading.Thread(target=light)
h.start()
#线程队列(先进先出)
import queue
q = queue.Queue()
q.put(1)
q.put("3")
q.put({"a":5})
print(q.get())
print(q.get())
print(q.get())
#堆栈队列 (先进后出)
import queue
q = queue.LifoQueue()
q.put(1)
q.put("3")
q.put({"a":5})
print(q.get())
print(q.get())
print(q.get())
#优先级队列
import queue
q = queue.PriorityQueue()
q.put((2,"A"))
q.put((8,"B"))
q.put((4,"C"))
print(q.get())
print(q.get())
print(q.get())
优先级队列:
带有优先级数字越小优先级越高,数据优先级高的先被取出,应用于VIP用户数据优先被取出的情况