day11学python 多线程+queue
多线程+queue
两种定义线程方法
1调用threading.Thread(target=目标函数,args=(目标函数的传输内容))(简洁方便)
2创建一个类继承与(threading.Thread)并重构run()函数
class MyThread(threading.Thread):
def run(self):
1.直接调用函数方法实例
import threading,time def run(n): print("test",n) time.sleep(2) start_time=time.time() tall=[] #用作储存线程实例 for i in range(50): t=threading.Thread(target=run,args=('t-%s'%i,)) t.setDaemon(True) #把当前线程设置为守护线程 t.start() tall.append(t) # for t in tall: # t.join() print("time:",time.time()-start_time) print(threading.active_count())
2.①继承类 ②实例化 示例
import threading,time class MyThread(threading.Thread): def __init__(self,n): super(MyThread,self).__init__() self.n=n def run(self): print("running task",self.n) t1=MyThread("t1") t2=MyThread("t2") t1.start() t2.start()
补充:
1两个进程一起进行 线程.join()等待该线程执行完毕后 在进行之后操作
2整个程序有主线程,会和其他线程并行
3可将线程储存在数组里
4 t.setDaemon(True) #把当前线程设置为守护线程-主线程结束守护线程自动结束(主仆关系)
5 t.start()调用start函数代表线程开始
================================================
同步对象 event
可调用的函数
#event.wait() 使当前线程等待 直到被设定
#event.set() 设定标志位
#event.is_set() 判断是否被设定
#event.clear() 清除设定
以下是对红绿灯的示例
灯为一线程
车为一线程
import time import threading event=threading.Event() def lighter(): count=0 event.set() while True: time.sleep(1) if count>4 and count<10: #改为红灯 event.clear() print("\033[41;1mred light is on...\033[0m") elif count>=10: event.set() count=0 else: print("\033[42;1mgreen light is on...\033[0m") time.sleep(1) count+=1 def car(name): while True: if event.is_set(): print(name,"is going") time.sleep(1) else: print(name,"stop!") event.wait() car1=threading.Thread(target=car,args=("宝马",)) car1.start() t=threading.Thread(target=lighter,) t.start()
注意:
1先实例化event对象 event=threading.Event()
2利用上方红字4个event函数调用 达到多线程交互进行
3threading.Thread(target=car,args=("宝马",)) 在实例化线程时threading.Thread(target=调用的函数名,args=(参数,)) //必须使用元组形式
==========================================================
queue队列
q=queue.Queue(maxsize=5) 首先实例化队列 可以自定最大值需要maxsize=
1q.put() //向队列中塞一个
2q.get() //从队列中取一个
最多塞maxsize个 最少为0个 取一个后,此数据将不存在
以下是对queue的实例
提供者与两个消费者三线程
提供者最多产5个
import queue,threading,time q=queue.Queue(maxsize=5) def produce(name): count=0 while True: count+=1 # print(count) q.put("%s生产%s个面包"%(name,count)) print("产了",count) time.sleep(0.2) def consumer(name): while True: print(name,"is eating ",q.get()) time.sleep(1) a=threading.Thread(target=produce,args=("cf",)) b=threading.Thread(target=consumer,args=("xxx",)) c=threading.Thread(target=consumer,args=("sss",)) a.start() b.start() c.start()
注意:
q=queue.Queue(maxsize=5)务必使用前实例化!!