• 线程和队列


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

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

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

    多线程的简单实现:

     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()
  • 相关阅读:
    算法导论--第七章、快速排序
    PS操作
    【字符编码】彻底理解字符编码
    HTML网页设计-代码效果记录
    Ubuntu 18.04 nvidia driver 390.48 安装 TensorFlow 1.12.0 和 PyTorch 1.0.0 详细教程
    cmake更新版本简记
    计算机图形学(二)——微表面模型
    计算机图形学(一)——辐照度学概述
    蒙特卡洛积分与重要性采样详解
    for循环提高内存访问效率的做法
  • 原文地址:https://www.cnblogs.com/wen-kang/p/9415467.html
Copyright © 2020-2023  润新知