• python queue 讲解


    threading.Thread().join()方法和queue.join)()的区别

    线程的join()是主线程等待子线程的执行完毕再执行, 队列的join()是主线程等待队列中的任务都消耗完再执行。

    Python的Queue模块中提供了同步的线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语能够在多线程中直接使用。可以使用队列来实现线程间的同步。

    Queue模块中的常用方法:

    • Queue.qsize() 返回队列的大小
    • Queue.empty() 如果队列为空,返回True,反之False
    • Queue.full() 如果队列满了,返回True,反之False
    • Queue.full 与 maxsize 大小对应
    • Queue.get([block[, timeout]])获取队列,timeout等待时间
    • Queue.get_nowait() 相当Queue.get(False)
    • Queue.put(item) 写入队列,timeout等待时间
    • Queue.put_nowait(item) 相当Queue.put(item, False)
    • Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
    • Queue.join() 实际上意味着等到队列为空,再执行别的操作
       
      
      from queue import Queue
      from queue import PriorityQueue
      print("Queue类实现了一个基本的先进先出(FIFO)容器,使用put()将元素添加到序列尾端,get()从队列尾部移除元素。
      ")
       
      q = Queue()
       
      for i in range(3):
          q.put(i)
       
      while not q.empty():
          print(q.get())
       
      print("与标准FIFO实现Queue不同的是,LifoQueue使用后进先出序(会关联一个栈数据结构)。
      ")
       
      from queue import LifoQueue
       
      q1 = LifoQueue()
       
      for i in range(3):
          q1.put(i)
       
      while not q1.empty():
          print(q1.get())
       
       
      print("除了按元素入列顺序外,有时需要根据队列中元素的特性来决定元素的处理顺序。例如,老板的打印任务可能比研发的打印任务优先级更高。PriorityQueue依据队列中内容的排序顺序(sort order)来决定那个元素将被检索。")
       
       
      class Job(object):
          def __init__(self, priority, description):
              self.priority = priority
              self.description = description
              print('New job:', description)
              return
       
          def __lt__(self, other):
              return self.priority < other.priority
       
      q2 = PriorityQueue()
       
      q2.put(Job(5, 'Mid-level job'))
      q2.put(Job(10, 'Low-level job'))
      q2.put(Job(1, 'Important job')) #数字越小,优先级越高
       
      while not q2.empty():
          next_job = q2.get() #可根据优先级取序列
          print('Processing job', next_job.description)
       
      print(help(Queue))
      
      Queue类实现了一个基本的先进先出(FIFO)容器,使用put()将元素添加到序列尾端,get()从队列尾部移除元素。
      0
      1
      2
      与标准FIFO实现Queue不同的是,LifoQueue使用后进先出序(会关联一个栈数据结构)。
      2
      1
      0
      除了按元素入列顺序外,有时需要根据队列中元素的特性来决定元素的处理顺序。例如,老板的打印任务可能比研发的打印任务优先级更高。PriorityQueue依据队列中内容的排序顺序(sort order)来决定那个元素将被检索。
      New job: Mid-level job
      New job: Low-level job
      New job: Important job
      Processing job Important job
      Processing job Mid-level job
      Processing job Low-level job
      --------------------- 
      
    关注公众号 海量干货等你
  • 相关阅读:
    Qt5中QMessageBox::warning()的第一个参数写this时出错
    Qt5如何设置静态编译,解决生成的可执行文件打开出错问题
    SpringCloud OAuth2实现单点登录以及OAuth2源码原理解析
    Redis分区
    Redis持久化
    如何合理地估算线程池大小?
    并发减库存
    Java导出Excel
    电商促销后台逻辑
    Java8虚拟机内存模型
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734272.html
Copyright © 2020-2023  润新知