线程和队列

进程:一段程序的执行过程 是最小的资源单位

线程:微进程,是最小的执行单元

一个程序至少有一个进程,一个进程至少有一个线程(主线程)

多线程的简单实现:

 1 import threading
 2 import time
 3 def play():
 4     print('star play game %s'%time.ctime())
 5     time.sleep(3)
 6     print('end play game %s' % time.ctime())
 7 
 8 def read():
 9     print('star read book %s' % time.ctime())
10     time.sleep(5)
11     print('end read book %s' % time.ctime())
12 
13 
14 if __name__=='__main__':
15     t1=threading.Thread(target=play)
16     t1.start()
17 
18     t2=threading.Thread(target=read)
19     t2.setDaemon(True) #守护线程 与主线程同步结束 主线程只会考虑t1是否执行完成
20     t2.start()
21 
22     # t2.join()#必须等他执行完才可以执行
23 
24     print('the end...')

 用Event 来处理线程同步下某个线程优先被执行 其他线程处于等待之下:

 1 import threading
 2 import time
 3 class MyThread(threading.Thread):
 4     def run(self):
 5         pass
 6 class Boss(threading.Thread):
 7     def run(self):
 8         print('现在开始加班哈')
 9         event.set()
10         time.sleep(5)
11         print('ok,现在可以下班了哈')
12         event.set()
13 
14 class Worker(threading.Thread):
15     def run(self):
16         event.wait()  #等待老板讲话
17         print('我靠,一言不合就加班')
18         time.sleep(2)
19         event.clear() #清除第一次的event
20         event.wait() #二次等待老板发话
21         print('快走,下班咯!!!')
22         # event.clear()
23 
24 
25 if __name__=='__main__':
26     event=threading.Event()  #创建一个线程同步对象
27 
28     l=[]
29     for i in range(4):
30         l.append(Worker())
31     l.append(Boss())
32 
33     for t in l:
34         t.start()
35 
36     for t in l:
37         t.join()
38 
39     print('the end...')

线程同步锁的启用:threading.Lock

 1 import threading
 2 import time
 3 
 4 
 5 def sun():
 6    global n
 7 
 8    lock.acquire()  #启用
 9    temp=n
10    time.sleep(0.001)
11    n=temp+1
12    lock.release()   #释放
13 
14 n=0
15 lock=threading.Lock() #一个同步锁对象
16 lis=[]
17 for i in range(100):
18     t=threading.Thread(target=sun)
19     t.start()
20     lis.append(t)
21 
22 for k in lis:
23     k.join()
24 
25 print(n)

 信号量 Semaphore() 同时可以开几个进程 不填参数则默认为1个

 1 import time
 2 import threading
 3 class MyThread(threading.Thread):
 4     def run(self):
 5         pass
 6 
 7 class Show(threading.Thread):
 8     def run(self):
 9        if sen.acquire():
10             print(self.name)
11             time.sleep(2)
12             sen.release()
13 
14 if __name__=='__main__':
15     sen=threading.Semaphore(5)   #一次可以同时进来五个
16     lis=[]
17     for i in range(20):
18         lis.append(Show())
19 
20     for t in lis:
21         t.start()
22     for t in lis:
23         t.join()
24 
25     print('the end。。。')

 队列queue:一种新的数据结构用来解决线程安全问题

 1 import queue
 2 q=queue.Queue(5)        #先进先出
 3 q=queue.LifoQueue(5)    #先进后出
 4 q=queue.PriorityQueue(5) #按优先级输出 序号小的先输出 数值必须放在列表里面
 5 
 6 q.put([2,'kevin'])
 7 q.put([1,23])
 8 q.put([4,['a','b','c']])
 9 q.put([3,{'name':'jim'}])
10 
11 while True:
12     print(q.get()[1])
13     print('***********')

 生产者消费者模式:通过一个容器来取消二者的强耦合性 用队列来使二者达到平衡关系

 1 import threading
 2 import queue
 3 import time
 4 q=queue.Queue()
 5 
 6 def Scz(name): #生产者
 7     count=0
 8     while count<10:
 9         print('making ……')
10         time.sleep(2)
11         q.put(count)
12 
13         print('%s做好了第%s个包子'%(name,count))
14         count += 1
15         q.task_done()
16         print('ok')
17 
18 def Xfz(name):#消费者
19     count=0
20     while count<10:
21         time.sleep(5)
22         print('waitting……')
23         q.join()
24         data=q.get()
25         # q.join()
26         print('%s吃了第%s个包子'%(name,data))
27         count+=1
28 
29 s=threading.Thread(target=Scz,args=('厨师',)) 
30 x1=threading.Thread(target=Xfz,args=('消费者1',))  #args必须为元组接收参数
31 x2=threading.Thread(target=Xfz,args=('消费者2',))
32 x3=threading.Thread(target=Xfz,args=('消费者3',))
33 
34 s.start()
35 x1.start()
36 x2.start()
37 x3.start()

 

posted @ 2018-08-03 17:45  青红*皂了个白  阅读(179)  评论(0编辑  收藏  举报