Python多任务

2021-01-21 08:14

阅读:461

  • 队列:Python 的 Queue 模块中提供了同步的、线程安全的队列类,包括 FIFO(先入先出)队列 Queue, LIFO(后入先出)队列 LifoQueue,和优先级队列 PriorityQueue。这些队列都实现了锁原语 (可以理解为原子操作,即要么不做,要么就做完),能够在多线程中直接使用。可以使用 队列来实现线程间的同步

  • from queue import Queue
    #1.创建队列对象
    # q = Queue(maxsize=3) #3表示最多存放3个数据
    #参数maxsize 是队列中允许的最大项,如果省略次参数,则无大小限制,
    #返回值q是队列对象
    # 2.put()方法 , 项队列中存放数据 如果q为空,此方法阻塞,直到队列可用为止
    # 3.get()方法 ,返回队列中的一个项目,如果队列为空,此方法阻塞,直到队列可用为止
    # 4.get_nowait(), 不等待,直接抛出异常
    # 5.full() , 如果q已满,返回True
    # 6.empty(),  如果q已空,返回True
    # 7.qsize(), q中数据的个数
    
    q = Queue(maxsize=3)
    q.put("张伟强")
    # print(q.empty())
    q.put("刘江")
    q.put("张威")
    print(q.full())
    # q.put("徐伟明")
    print(q.get())
    print(q.get())
    print(q.get())
    # print(q.get(timeout=3))
    # print(q.get_nowait())
    print(q.qsize())
    
  • 生产者与消费者模式

    • 生产者:生产数据的线程

    • 消费者:处理数据的线程

    • 目的:平衡生产者和消费者的工作能力来提高程序的整体处理数据的速度

      import threading
      import queue
      import time
      
      def producer(name): #生产者
          count = 1
          while True:
              print("%s生产了包子%d"%(name,count))
              q.put(count)
              count+=1
              time.sleep(0.2)
              print("包子总数",q.qsize())
      def costom(name): #消费者
          while True:
              print("%s吃了包子%d"%(name,q.get()))
              time.sleep(1)
      if __name__ == ‘__main__‘:
          q = queue.Queue(maxsize=3)
          t1 = threading.Thread(target=producer,args=("张大厨",))
          t2 = threading.Thread(target=costom, args=("吃货刘",))
          t3 = threading.Thread(target=costom, args=("吃货朱",))
          t1.start()
          t2.start()
          t3.start()
      
    • 为什么使用生产者和消费者模式

      • 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当 中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理 完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必 须等待生产者。为了解决这个问题于是引入了生产者和消费者模式
    • 什么是生产者消费者模式

      • 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼 此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力


评论


亲,登录后才可以留言!